9

この構造を持つパッケージを配布しています:

mymodule:
  mymodule/__init__.py
  mymodule/code.py
  scripts/script1.py
  scripts/script2.py

mymoduleサブディレクトリにmymoduleはコードが含まれており、scriptsサブディレクトリにはユーザーが実行できるスクリプトが含まれています。

でパッケージのインストールを説明するときはsetup.py、次のように使用します。

scripts=['myscripts/script1.py']

スクリプトの移動先を指定します。インストール中に、それらは通常、プラットフォーム/ユーザー固有のbinディレクトリに移動します。私が持っているコードはmymodule/mymodule、スクリプトを呼び出す必要があります。これらのスクリプトへの完全なパスを見つける正しい方法は何ですか? 理想的には、それらはその時点でユーザーのパス上にある必要があるため、シェルからそれらを呼び出したい場合は、次のことができるはずです。

os.system('script1.py args')

しかし、次のように、プラットフォーム固有の bin ディレクトリが にあることに依存せずに、絶対パスでスクリプトを呼び出したいと思いますPATH

# get the directory where the scripts reside in current installation
scripts_dir = get_scripts_dir()
script1_path = os.path.join(scripts_dir, "script1.py")
os.system("%s args" %(script1_path))

これはどのように行うことができますか?ありがとう。

EDITスクリプトの外側のコードを削除することは、私にとって実用的な解決策ではありません。その理由は、私がジョブをクラスタ システムに分散しているからです。私が通常行う方法は次のようなものです。実行したい一連のタスクがあると想像してください。すべてのタスクを入力として受け取り、特定のタスクでのみ実行される別のスクリプトを呼び出すスクリプトがあります。何かのようなもの:

main.py:
for task in tasks:
  cmd = "python script.py %s" %(task)
  execute_on_system(cmd)

によって実行可能なコマンドである必要があるため、somain.pyがどこにあるかを知る必要があります。script.pyexecute_on_system

4

3 に答える 3

3

コードからスクリプトを呼び出す必要がないように、コードを構造化する必要があると思います。必要なコードをスクリプトからパッケージに移動すると、スクリプトとコードの両方からこのコードを呼び出すことができます。

于 2012-10-20T10:49:01.637 に答える