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解释器.
如您所料,您应该能够在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 是如何工作的?)
如果您需要使用的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一起连接在一起……实际上忽略了它。
你可以在这里看到更多。