pythonスクリプトがpyenv
virtualenv
から実行されることになっている場合、ファイルの正しいShebangは何ですか?
テストケースの例として、私のシステム(OSX)のデフォルトpythonにはpandas
がインストールされていません。pyenvvirtualenv venv_name
します。 virtualenvからpython実行可能ファイルのパスを取得しようとしました。
$ pyenv activate venv_name
(venv_name)$ which python
/Users/username/.pyenv/shims/python
だから私は例を作成しましたscript.py
:
#!/Users/username/.pyenv/shims/python
import pandas as pd
print 'success'
しかし、スクリプトを実行しようとすると、エラーが発生しました。
(venv_name) $ ./script.py
./script.py: line 2: import: command not found
./script.py: line 3: print: command not found
コマンドラインでそのパスを実行するとうまくいきますが:
(venv_name) $ /Users/username/.pyenv/shims/python script.py
success
(venv_name) $ python script.py # also works
success
これに適切なシバンは何ですか?理想的には、現在のvenvが何であれpythonを指すように汎用的なものが必要です。
完全なパスでインタープリターを呼び出すことがうまくいかない理由はよくわかりませんが、常に使用していますが、環境内にあるpythonインタープリターを使用する場合は、次のようにする必要があります。
#!/usr/bin/env python
そのようにして、使用するpythonインタープリターの環境を検索します。
#!
Shebang行に入れることができる以上のシェルを使用する必要がある場合、同じファイルでPython=)を起動する単純なシェルスクリプトでファイルを開始できます。
#!/bin/bash
"exec" "pyenv" "exec" "python" "$0" "$@"
# the rest of your Python script can be written below
引用のため、Pythonは最初の行を実行せず、モジュールdocstring ...の文字列を結合しますが、事実上それは無視されます。
もっと見ることができます こちら 。
予想どおり、Shebangの仮想環境のpythonへのフルパスを使用して、制御スクリプトの環境に関係なく、スクリプトを実行する環境を選択/制御することができます。
質問へのコメントで、VPfBと/Users/username/.pyenv/shims/python
は、exec $pyenv_python
。 echo $pyenv_python
は、実際のpythonを決定し、それをシバンとして使用します。
pyenv virtualenvs
は、仮想環境ディレクトリのリストを検索します。
そして、あなたは次のようなShebangの使用を見つけるかもしれません:
#!/Users/username/.pyenv/python/versions/venv_name/bin/python
import pandas as pd
print 'success'
...は、他の(仮想または非)環境で選択された仮想環境を使用してスクリプトが機能するようにします。
(venv_name) $ ./script.py
success
(venv_name) $ pyenv activate non_pandas_venv
(non_pandas_venv) $ ./script.py
success
(non_pandas_venv) $ . deactivate
$ ./script.py
success
$
トリックは、仮想環境のpythonバイナリを具体的に呼び出すと、pythonがサポートファイルのそのバイナリのパスの場所を見て、周囲を使用して終わることです仮想環境( virtualenvの仕組み を参照)
ファイル権限を確認する必要があるかもしれません:
Sudo chmod +x script.py