web-dev-qa-db-ja.com

pythonスクリプトをpyenv virtualenvで実行するために使用するShebang

pythonスクリプトがpyenvvirtualenvから実行されることになっている場合、ファイルの正しい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を指すように汎用的なものが必要です。

34
xgord

完全なパスでインタープリターを呼び出すことがうまくいかない理由はよくわかりませんが、常に使用していますが、環境内にあるpythonインタープリターを使用する場合は、次のようにする必要があります。

#!/usr/bin/env python

そのようにして、使用するpythonインタープリターの環境を検索します。

46
DSLima90

#! Shebang行に入れることができる以上のシェルを使用する必要がある場合、同じファイルでPython=)を起動する単純なシェルスクリプトでファイルを開始できます。

#!/bin/bash
"exec" "pyenv" "exec" "python" "$0" "$@"
# the rest of your Python script can be written below

引用のため、Pythonは最初の行を実行せず、モジュールdocstring ...の文字列を結合しますが、事実上それは無視されます。

もっと見ることができます こちら

4
ephemient

予想どおり、Shebangの仮想環境のpythonへのフルパスを使用して、制御スクリプトの環境に関係なく、スクリプトを実行する環境を選択/制御することができます。

質問へのコメントで、VPfBと/Users/username/.pyenv/shims/pythonは、exec $pyenv_pythonecho $pyenv_pythonは、実際のpythonを決定し、それをシバンとして使用します。

参照: https://unix.stackexchange.com/questions/209646/how-to-activate-virtualenv-when-a-python-script-starts

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の仕組み を参照)

3
Dave X

ファイル権限を確認する必要があるかもしれません:

Sudo chmod +x script.py
0
sadkeanu