用于python脚本的shebang在pyenv virtualenv下运行

xgo*_*ord 37 python python-2.7 pyenv

当一个python脚本应该从pyenv virtualenv文件的正确shebang 运行?

作为示例测试用例,我的系统(OSX)上的默认python尚未pandas安装.pyenv virtualenv venv_name确实如此.我尝试从virtualenv获取python可执行文件的路径.

$ pyenv activate venv_name
(venv_name)$ which python
/Users/username/.pyenv/shims/python
Run Code Online (Sandbox Code Playgroud)


所以我举了我的榜样script.py:

#!/Users/username/.pyenv/shims/python
import pandas as pd
print 'success'
Run Code Online (Sandbox Code Playgroud)


但是当我尝试运行脚本时,我收到了一个错误:

(venv_name) $ ./script.py
./script.py: line 2: import: command not found
./script.py: line 3: print: command not found
Run Code Online (Sandbox Code Playgroud)


虽然在命令行上运行该路径工作正常:

(venv_name) $ /Users/username/.pyenv/shims/python script.py
success

(venv_name) $ python script.py # also works
success
Run Code Online (Sandbox Code Playgroud)

什么是适当的shebang为此?理想情况下,我想要一些通用的东西,以便它指向我目前的venv所在的python.

DSL*_*a90 54

我真的不知道为什么用完整路径调用解释器对你不起作用,我一直使用它,但如果你想使用你环境中的python解释器,你应该这样做:

#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)

这样您就可以在环境中搜索要使用的python解释器.

  • 确认它仍然可以在2018年4月使用Python 3.6.4,谢谢! (5认同)
  • 感谢 python 的“virtual shebangs”功能,这甚至可以在 Windows 上运行。 (3认同)

Dav*_*e X 9

如您所料,您应该能够在shebang 中使用虚拟环境python 的完整路径来选择/控制脚本运行的环境,而不管控制脚本的环境如何。

在对您的问题 VPfB 的评论中,您发现这/Users/username/.pyenv/shims/python是一个执行exec $pyenv_python. 您应该能够 echo $pyenv_python确定真正的蟒蛇并将其用作您的shebang。

另见: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'
Run Code Online (Sandbox Code Playgroud)

...将使脚本能够在其他(虚拟或非虚拟)环境中使用所选的虚拟环境工作:

(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
$
Run Code Online (Sandbox Code Playgroud)

诀窍是,如果您专门调用虚拟环境的 python 二进制文件,python 会在该二进制文件的路径位置周围查找支持文件,并最终使用周围的虚拟环境。(参见每virtualenv 是如何工作的?


eph*_*ent 5

如果您需要使用的shell数量超出了#!shebang行的数量,则可以使用简单的shell脚本启动该文件,该脚本会在同一文件上启动Python。

#!/bin/bash
"exec" "pyenv" "exec" "python" "$0" "$@"
# the rest of your Python script can be written below
Run Code Online (Sandbox Code Playgroud)

由于引用原因,Python不会执行第一行,而是将字符串与模块docstring一起连接在一起……实际上忽略了它。

你可以在这里看到更多。