web-dev-qa-db-ja.com

Pythonに自分のモジュールをインポートできない

モジュールのインポートがPythonでどのように機能するかを理解するのに苦労しています(これまで他の言語で行ったことはありません)。

私が持っているとしましょう:

myapp/__init__.py
myapp/myapp/myapp.py
myapp/myapp/SomeObject.py
myapp/tests/TestCase.py

今、私はこのようなものを取得しようとしています:

myapp.py
===================
from myapp import SomeObject
# stuff ...

TestCase.py
===================
from myapp import SomeObject
# some tests on SomeObject

ただし、Pythonはmyappがモジュールであることを認識できないため、間違いを犯しています。

ImportError: No module named myapp
109
n0pe

特定のケースでは、myapp.pyおよびTestCase.pyスクリプトからSomeObjectをインポートしようとしているようです。 myapp.pyから、

import SomeObject

同じフォルダにあるためです。 TestCase.pyの場合

from ..myapp import SomeObject

ただし、、これは、パッケージからTestCaseをインポートする場合にのみ機能します。 python TestCase.pyを直接実行する場合、パスを台無しにする必要があります。これはPython内で実行できます。

import sys
sys.path.append("..")
from myapp import SomeObject

ただし、これは一般的に推奨されません。

一般的に、他の人にPythonパッケージを使用させたい場合は、 distutils を使用してセットアップスクリプトを作成する必要があります。そうすれば、だれでもpython setup.py installのようなコマンドを使用してパッケージを簡単にインストールでき、マシンのどこからでも利用できます。パッケージを真剣に考えているなら、Pythonパッケージインデックス PyPI に追加することもできます。

79
David Robinson

関数importは、PYTHONPATH env内のファイルを探します。変数とローカルディレクトリ。したがって、すべてのファイルを同じディレクトリに配置するか、ターミナルに入力するパスをエクスポートできます。

export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/"
30
Zenon

パスをエクスポートするのは良い方法です。別の方法は、サイトパッケージの場所に.pthを追加することです。私のMacでは、pythonは以下に示す/ Library/Pythonにサイトパッケージを保持します

/Library/Python/2.7/site-packages

/Library/Python/2.7/site-packages/awesome.pthにawesome.pthというファイルを作成し、そのファイルに私の素晴らしいモジュールを参照する次のパスを入れました

/opt/awesome/custom_python_modules
10
jmontross

あなたが試すことができます

from myapp.myapp import SomeObject

プロジェクト名はmyapp.pyと同じであるため、最初にプロジェクトドキュメントを検索します

6
阿东刘

最初のmyappディレクトリで、uはsetup.pyファイルを追加し、setup.pyに2つのpythonコードを追加できます

from setuptools import setup
setup(name='myapp')

コマンドラインの最初のmyappディレクトリで、pip install -eを使用します。パッケージをインストールする

Windows 10のpip installは、デフォルトで「Program Files/PythonXX/Lib/site-packages」にインストールされますが、これは管理者権限が必要なディレクトリです。そこで、私は管理者としてpip installを実行(管理者アカウントでログインしている場合でも、管理者としてコマンドプロンプトを開く必要があります)で問題を修正しました。また、pythonからpipを呼び出す方が安全です。
例えば。
python -m pip install <package-name>
の代わりに
pip install <package-name>

1
sziraqui

私の場合、Windows vs Python驚きでした。Windowsファイル名は大文字と小文字を区別しませんが、Pythonインポートはそうです。したがって、Stuff.pyファイルがある場合は、この名前をそのままインポートする必要があります。

0
astrowalker