4

私はかなり前から答えをウェブで探していましたが、これは私に本当に頭痛の種を与えています:

Ubuntu 12.04を使用していて、フルパスを使用せずにターミナルからPythonスクリプトを実行したいと考えています。そこで、以下を./bashrcに追加して、PATH変数に/ home / kyril / python /scripts/を追加しました。

kyrilpathvariable="/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/kyril/Python/scripts/:/home/kyril/Bash/scripts"

if [ "$kyrilpathvariable" = "$PATH" ]; then
    echo PATH already exported

else

PATH=$PATH:/home/kyril/Python/scripts/
PATH=$PATH:/home/kyril/Bash/scripts/
export PATH

fi

(if句は必要ないことはわかっていますが、exec bashと入力した場合、PATHにすべてを2回含めるのは好きではありませんでした。)

問題:これは私のBashスクリプトで完全に機能するので、chmodを介して実行可能にした後、入力するだけ$ script.shで実行されます。ただし、入力$ python3 script.pyすると次のエラーが発生します。python3: can't open file 'script.py': [Errno 2] No such file or directory

スクリプトへのフルパスを入力すると、機能します。誰かが私が間違っていることを知っていますか?ディレクトリをPYTHONPATHに追加する必要がありますか?(私が理解したように、これはモジュールのインポートにのみ役立ちます)。

みんなありがとう!

4

4 に答える 4

5

python3直接呼び出す場合、Pythonは、それ$PATHを見つけるために使用することなく、指示されたスクリプトファイルを実行します。 PYTHONPATH無関係です-Pythonモジュールの検索に使用されます。

単独で実行すると、間違ったインタプリタが呼び出されるという問題が発生していると思いますscript.py。スクリプトの最初の行が何であるかはわかりませんが、次のようになります。

#!/usr/bin/env python3

または、さらに細かい制御が必要な場合:

#!/usr/bin/env python3.2

Python 2スクリプトの場合:

#!/usr/bin/env python2

または:

#!/usr/bin/env python2.7

これらの実行可能ファイルを使用する前に、これらの実行可能ファイルがシステムに存在することを確認する必要があります。

于 2012-05-05T11:02:13.730 に答える
0
python3 $(type -P script.py)

PATH実行可能ファイルを検索し、その場所と名前を指定するようにBashに指示します。

例えば:

$ type -P script.py
/usr/local/bin/script.py
于 2012-05-05T11:13:43.563 に答える
0

Pythonが入力ファイルを検索するとき、パス変数は無視されると思います。Pythonは、現在のディレクトリで「script.py」の検索を開始しますが、そのファイルに対して宣言されたパス変数があることを知らないため、それを見つけることができません。

残念ながら、それを解決する方法はわかりませんが、変数の経験が豊富な人が私たちを啓発できるかもしれません。

于 2012-05-05T10:52:41.373 に答える
0

パス内のエントリの重複を避けるために、次のことができます。

for dir in Python Bash; do
  dir_to_add="$HOME/$dir/scripts"
  case ":$PATH:" in
    *:"$dir_to_add":*) ;; # path already contains dir, do nothing
    *) PATH+=":$dir_to_add" ;;
  esac
done
于 2012-05-05T12:38:43.777 に答える