setup.py
他に配布の計画がある場合でも、基本をsrc
フォルダにまとめる価値があるかもしれません。そうすれば、setup.py develop
distutilsにコードへのリンクをデフォルトのパスに配置させることができます(つまり、行った変更は「再インストール」せずにインプレースに反映され、すべてのモジュールはどこにいても「正常に機能」しますスクリプトは)です。これは1回限りのステップですが、それでもゼロより1ステップ多いため、更新よりも問題が多いかどうかによって異なります.bashrc
。pipを使用する場合、同等のものはになりますpip install -e /path/to/src
。
より堅牢なソリューション(特に、これらのスクリプトを複数の開発者のマシンでミラーリング/バージョン管理する場合)は、制御された仮想環境内で開発作業を行うことです。virtualenvには、独自のブートストラップのカスタマイズを行うためのサポートが組み込まれていることがわかりました。微調整、実行、またはプレーンファイルをサイトパッケージに追加するためのafter_install()
フックが必要なようです。カスタムブートストラップは、他のスクリプトと一緒にソース管理に存在する可能性があり、開発者のセットアップごとに1回実行する必要があります。また、virtualenvを使用する通常の利点もあります(明示的な依存関係のバージョン管理、システム全体の構成からの分離、異種マシン間の標準化など)。sitecustomize
pip install -e
.pth
セットアップ手順をまったく必要とせず、これらのスクリプトを「プロジェクト」ディレクトリ内からのみ__init__.py
実行する場合は、次のように入力できます。
project/
src/
some_module.py
scripts/
__init__.py # special "magic"
some_script.py
そして、これらはあなたのファイルがどのように見えるかです:
# file: project/src/some_module.py
print("importing %r" % __name__)
def some_function():
print("called some_function() inside %s" % __name__)
--------------------------------------------------------
# file: project/scripts/some_script.py
import some_module
if __name__ == '__main__':
some_module.some_function()
--------------------------------------------------------
# file: project/scripts/__init__.py
import sys
from os.path import dirname, abspath, join
print("doing magic!")
sys.path.insert(0, join(dirname(dirname(abspath(__file__))), 'src'))
次に、次のようにスクリプトを実行する必要があります。
[~/project] $ python -m scripts.some_script
doing magic!
importing 'some_module'
called some_function() inside some_module
注意してください!スクリプトは、このように内部からのみproject/
呼び出すことができます。
[~/otherdir] $ python -m scripts.some_script
ImportError: no module named scripts
これを有効にするには、編集に戻る.bashrc
か、上記のオプションのいずれかを使用します。最後のオプションは、実際には最後の手段である必要があります。@Simonが言ったように、あなたはその時点で本当に言語と戦っています。