web-dev-qa-db-ja.com

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

Pythonスクリプトでファイルを相対ディレクトリで検索します。例:Pythonスクリプトは/home/username/projectname/にあります。ファイルがありますこれは、/home/username/projectname/subfolderにあるPythonスクリプト内で呼び出されます。

シェルからスクリプトをpython scriptname.pyとして実行すると、完全に正常に実行されます。

ただし、スクリプトをスタートアップサービスとして実行しようとしています。私はそれをwebminで設定しています。それを呼び出すためのシェルスクリプトを作成していると思います。起動スクリプトを通して、私はスクリプトを呼び出すために次のようなことをしています:

execute python home/username/projectname/scriptname.py

スクリプトは正常に起動していますが、相対ディレクトリのファイルにアクセスできません。

相対パスを認識できるように、起動スクリプト内からPythonプログラムを呼び出すより良い方法があると思います。

4
Randy

素早く汚い:

pythonスクリプトを実行するだけでなく、起動スクリプトで最初にcdを使用します。

#!/bin/sh

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

Pythonスクリプトでは、これを直接回避する方法がいくつかあります。

  1. スクリプトが常に「/ 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()呼び出しをそこに挿入する必要があるかもしれませんが、少し試してみれば機能するはずです。

  2. 上記の回答と同様に、ラッパースクリプトを必要とせずに、Pythonスクリプトでディレクトリをすべて変更することができます。

    _import os
    os.chdir("/home/username/projectname")
    _
7
jlp

(サブシェルを使用して)実行するさらに高速で汚れた方法:

$ ( cd my/path/to/folder && python myprogram.py )
5
Naftuli Kay
set PYTHONPATH=PROJECTPATH && python script.py
0
Asif Mohammed