兄弟パッケージからのインポートに関する質問にも同様の回答を投稿しました。こちらでご覧いただけます。
sys.path
ハックなしのソリューション
概要
- (例えば、1つのフォルダにコードをラップ
packaged_stuff
)
- setuptools.setup()
setup.py
を使用する場所でcreate スクリプトを使用します。
- パッケージを編集可能な状態でピップインストール
pip install -e <myproject_folder>
- 使用してインポート
from packaged_stuff.modulename import function_name
セットアップ
質問と同じフォルダ構造を想定しています
.
└── ptdraft
├── __init__.py
├── nib.py
└── simulations
├── __init__.py
└── life
├── __init__.py
└── life.py
.
ルートフォルダーを呼び出しますC:\tmp\test_imports
。私の場合はにあります。
手順
1)をsetup.py
ルートフォルダに追加します
の内容はsetup.py
簡単にできます
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
基本的に「すべて」setup.py
が機能します。これは最小限の実用例です。
2)仮想環境を使用する
仮想環境に慣れている場合は、仮想環境をアクティブにして、次の手順にスキップしてください。仮想環境の使用は絶対に必要なわけではありませんが、長期的に見ると本当に役立ちます(複数のプロジェクトが進行中の場合)。最も基本的な手順は次のとおりです(ルートフォルダーで実行)
- 仮想環境を作成する
- 仮想環境をアクティブ化
. /venv/bin/activate
(Linux)または./venv/Scripts/activate
(Win)
詳細については、「python virtualenv tutorial」などのGoogleを使用してください。作成、アクティブ化、非アクティブ化以外のコマンドはおそらく必要ありません。
仮想環境を作成してアクティブ化すると、コンソールに仮想環境の名前が括弧内に表示されます。
PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
3)プロジェクトを編集可能な状態でpipインストールする
を使用して最上位パッケージmyproject
をインストールしますpip
。トリックは-e
、インストールを行うときにフラグを使用することです。これにより、編集可能な状態でインストールされ、.pyファイルに対して行われたすべての編集は、インストールされたパッケージに自動的に含まれます。
ルートディレクトリで、次を実行します。
pip install -e .
(ドットに注意してください、それは「現在のディレクトリ」を表します)
を使用してインストールされていることも確認できます pip freeze
(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0
4)mainfolder
すべてのインポートの前に追加してインポート
この例では、mainfolder
はになりますptdraft
。これには、他のモジュール名(python標準ライブラリまたはサードパーティモジュールから)と名前が競合しないという利点があります。
使用例
nib.py
def function_from_nib():
print('I am the return value from function_from_nib!')
life.py
from ptdraft.nib import function_from_nib
if __name__ == '__main__':
function_from_nib()
life.pyの実行
(venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!