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