モジュールのインポートが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
特定のケースでは、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 に追加することもできます。
関数import
は、PYTHONPATH env内のファイルを探します。変数とローカルディレクトリ。したがって、すべてのファイルを同じディレクトリに配置するか、ターミナルに入力するパスをエクスポートできます。
export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/"
パスをエクスポートするのは良い方法です。別の方法は、サイトパッケージの場所に.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
あなたが試すことができます
from myapp.myapp import SomeObject
プロジェクト名はmyapp.pyと同じであるため、最初にプロジェクトドキュメントを検索します
最初の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>
私の場合、Windows vs Python驚きでした。Windowsファイル名は大文字と小文字を区別しませんが、Pythonインポートはそうです。したがって、Stuff.py
ファイルがある場合は、この名前をそのままインポートする必要があります。