シェルスクリプトの作業ディレクトリを変更する方法

シェルスクリプトの作業ディレクトリを変更する方法

相対ディレクトリでファイルを検索する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最初に使用してください。

#!/bin/sh

cd /home/username/projectname &&
python ./scriptname.py

答え2

Pythonスクリプトでこの問題を直接解決する方法はいくつかあります。

  1. スクリプトが常に "/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]いくつかの実験で動作させることができます。

  2. 上記の答えと同様に、ラッパースクリプトなしでPythonスクリプトに自分自身でディレクトリを変更させることができます。

    import os
    os.chdir("/home/username/projectname")
    

答え3

より速くて汚い方法(サブシェルを使用):

( cd my/path/to/folder && python myprogram.py )

答え4

set PYTHONPATH=PROJECTPATH && python script.py

関連情報