5

プロジェクトには2つのディレクトリがあります。

project/
  src/
  scripts/

「src」には洗練されたコードが含まれ、「scripts」には1回限りのPythonスクリプトが含まれます。

すべてのスクリプトのsys.pathに「../src」を追加して、「src」ツリーの下のモジュールにアクセスできるようにします。これを行う1つの方法は、scripts / __init__。pyファイルを次の内容で作成することです。

scripts/__init__.py:
  import sys
  sys.path.append("../src")

これは機能しますが、すべてのスクリプトを「スクリプト」と呼ばれるパッケージに入れるという望ましくない副作用があります。すべてのスクリプトで上記の初期化コードを自動的に呼び出す方法は他にありますか?

.bashrcでPYTHONPATH環境変数を編集することもできますが、ユーザーがPYTHONPATHをいじる必要なしに、スクリプトをすぐに使用できるようにしたいと考えています。また、この1つのプロジェクトに対応するためだけに、アカウント全体を変更する必要はありません。

4

3 に答える 3

4

setup.py他に配布の計画がある場合でも、基本をsrcフォルダにまとめる価値があるかもしれません。そうすれば、setup.py developdistutilsにコードへのリンクをデフォルトのパスに配置させることができます(つまり、行った変更は「再インストール」せずにインプレースに反映され、すべてのモジュールはどこにいても「正常に機能」しますスクリプトは)です。これは1回限りのステップですが、それでもゼロより1ステップ多いため、更新よりも問題が多いかどうかによって異なります.bashrcpipを使用する場合、同等のものはになりますpip install -e /path/to/src

より堅牢なソリューション(特に、これらのスクリプトを複数の開発者のマシンでミラーリング/バージョン管理する場合)は、制御された仮想環境内で開発作業を行うことです。virtualenvには、独自のブートストラップのカスタマイズを行うためのサポートが組み込まれていることがわかりました。微調整、実行、またはプレーンファイルをサイトパッケージに追加するためのafter_install()フックが必要なようです。カスタムブートストラップは、他のスクリプトと一緒にソース管理に存在する可能性があり、開発者のセットアップごとに1回実行する必要があります。また、virtualenvを使用する通常の利点もあります(明示的な依存関係のバージョン管理、システム全体の構成からの分離、異種マシン間の標準化など)。sitecustomizepip 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が言ったように、あなたはその時点で本当に言語と戦っています。

于 2011-08-31T16:05:36.943 に答える
1

スクリプトを実行可能にする場合(コマンドラインから推測します)、スクリプトはどこかのパス上にある必要があります。

しかし、あなたがやろうとしていることについて何か奇妙に聞こえます。あなたが達成しようとしていることの正確な例を教えていただけますか?

于 2011-08-30T23:19:53.943 に答える
1

プロジェクトディレクトリに「pathHack.py」というファイルを追加して、次のようなファイルを追加できます。

import os
import sys
pkgDir = os.path.dirname(__file__)
sys.path.insert(os.path.join(pkgDir, 'scripts')

次に、プロジェクトディレクトリのPythonファイルで、次の手順から始めます。

import pathHack

そして今、あなたは「スクリプト」なしでスクリプトディレクトリからものをインポートすることができます。プレフィックス。このディレクトリにファイルが1つしかなく、この種のものを非表示にする必要がない場合は、このスニペットをインライン化できます。

于 2011-08-31T15:23:36.493 に答える