当python脚本应该从pyenv
virtualenv
运行时,文件的正确shebang是什么?
作为一个示例测试用例,我的系统(OSX)上的默认python没有安装pandas
。pyenv virtualenvvenv_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
什么是合适的shebang?理想情况下,我想要一些通用的东西,这样它就可以指向我当前的venv的python。
如果需要使用比放在
#!
shebang行中更多的shell,可以用一个简单的shell脚本启动文件,该脚本在同一个文件上启动Python。由于引用,Python不会执行第一行,而是将模块docstring的字符串连接在一起。。。这实际上忽略了它。
你可以看到更多的here。
我不知道为什么用完整路径调用解释器对您不起作用,我一直都在使用它,但是如果您想使用您环境中的python解释器,您应该这样做:
这样,您就可以在环境中搜索要使用的python解释器。
如您所料,您应该能够使用shebang中虚拟环境的python的完整路径来选择/控制脚本运行的环境,而不管控制脚本的环境如何。
在对您的问题的评论中,VPfB&;您发现
/Users/username/.pyenv/shims/python
是一个执行exec $pyenv_python
的shell脚本。您应该能够echo $pyenv_python
确定真正的python并将其用作shebang。另请参见:https://unix.stackexchange.com/questions/209646/how-to-activate-virtualenv-when-a-python-script-starts
尝试
pyenv virtualenvs
查找虚拟环境目录列表。然后你可能会发现一个像这样的使用shebang的东西:
。。。将使脚本能够在其他(虚拟或非虚拟)环境中使用所选虚拟环境:
诀窍在于,如果您特别调用虚拟环境的python二进制文件,python将查找该二进制文件的路径位置以查找支持文件,并最终使用周围的虚拟环境。(见第How does virtualenv work?)
相关问题 更多 >
编程相关推荐