簡単な答え: 環境に基づいて絶対パスを計算します。
本当に必要なのは、いくつかの指針です。標準ライブラリのさまざまな場所から収集できるさまざまなランタイムおよび環境情報があります (これらは、Windows にアプリケーションをデプロイするときに役立ちます)。
だから、最初にいくつかの一般的なこと:
os.path
- 多くのクロスプラットフォーム パス操作を備えた標準ライブラリ モジュール。あなたの親友。「os.pathをたどる」私はかつて本で読んだことがあります。
__file__
- 現在のモジュールの場所。
sys.executable
- 実行中の Python の場所。
これで、これら 3 つの情報源から必要なものをかなり収集できます。os.path の関数は、ツリーを回避するのに役立ちます。
os.path.join('path1', 'path2')
- クロスプラットフォームの方法でパス セグメントを結合する
os.path.expanduser('a_path')
a_path
-ユーザーのホーム ディレクトリでパスを見つける
os.path.abspath('a_path')
- 相対パスを絶対パスに変換します
os.path.dirname('a_path')
- パスがあるディレクトリを取得します
- もっとたくさん...
これを組み合わせると、たとえば次のようになります。
# script1.py
# Get the path to the script2.py in the same directory
import os
this_script_path = os.path.abspath(__file__)
this_dir_path = os.path.dirname(this_script_path)
script2_path = os.path.join(this_dir_path, 'script2.py')
print script2_path
そしてそれを実行します:
ali@work:~/tmp$ python script1.py
/home/ali/tmp/script2.py
あなたの特定のケースでは、「作業ディレクトリ」と「スクリプトがあるディレクトリ」の概念を少し混同しているようです。これらは同じ場合もありますが、異なる場合もあります。たとえば、「作業ディレクトリ」は変更できるため、それを使用する関数は、探しているものを見つけることができる場合がありますが、他のものを見つけることはできません。subprocess.Popen
はその一例です。
常に絶対パスを渡すと、作業ディレクトリの問題が発生することはありません。