相対ディレクトリ内のファイルを検索する Python スクリプトがあります。たとえば、Python スクリプトは にあります/home/username/projectname/
。Python スクリプト内で呼び出されるファイルは にあります/home/username/projectname/subfolder
。
シェルからスクリプトを実行すると、python scriptname.py
問題なく実行されます。
ただし、スクリプトをスタートアップ サービスとして実行しようとしています。Webmin で設定しており、それを呼び出すためのシェル スクリプトを作成していると思います。スタートアップ スクリプトを通じて、スクリプトを呼び出すために次のような操作を行っています。
execute python home/username/projectname/scriptname.py
スクリプトは正常に起動していますが、相対ディレクトリ内のファイルにアクセスできません。
相対パスを認識できるように、起動スクリプト内から Python プログラムを呼び出すより良い方法があると思います。
答え1
簡単に言うと:
起動スクリプトでは、単に Python スクリプトを実行するのではなく、cd
first を使用します。
#!/bin/sh
cd /home/username/projectname &&
python ./scriptname.py
答え2
Python スクリプトで直接これを回避する方法がいくつかあります。
スクリプトが常に「/home/username/projectname/subfolder」にある場合は、それを Python 内の検索パスに追加するだけです。
import sys sys.path.append("/home/username/projectname/subfolder")
ただし、複数の「projectname」ディレクトリにこれが存在する可能性があると思われるため、より一般的な解決策は次のようになります。
import sys import os sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), "subfolder"))
これは、Python スクリプトがあるディレクトリ ( 内
sys.argv[0]
) を見つけ、ディレクトリ部分を抽出し、それに「サブフォルダー」を追加して、検索パスに配置します。一部のオペレーティング システムでは、 に実行可能ファイル名のみが提供される場合があることに注意してください。 この場合の適切な解決策は私にはわかりませんが、おそらく他の誰かが持っているでしょう。 に相対パスがある場合は、そこに呼び出し
sys.argv[0]
を挿入する必要があるかもしれませんが、少し試してみると、機能するはずです。os.path.abspath()
sys.argv[0]
上記の回答と同様に、ラッパー スクリプトを必要とせずに、Python スクリプトでディレクトリをすべて自動的に変更することもできます。
import os os.chdir("/home/username/projectname")
答え3
さらに高速で、よりダーティな方法 (サブシェルを使用) :
( cd my/path/to/folder && python myprogram.py )
答え4
set PYTHONPATH=PROJECTPATH && python script.py