用于在pyenv虚拟环境中运行Python脚本的哪种shebang

2024-04-19 12:23:44 发布

您现在位置:Python中文网/ 问答频道 /正文

当python脚本应该从pyenvvirtualenv运行时,文件的正确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。


Tags: namepyimport路径脚本pyenvpandasvenv
3条回答

如果需要使用比放在#!shebang行中更多的shell,可以用一个简单的shell脚本启动文件,该脚本在同一个文件上启动Python。

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

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

你可以看到更多的here

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

#!/usr/bin/env 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的东西:

#!/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将查找该二进制文件的路径位置以查找支持文件,并最终使用周围的虚拟环境。(见第How does virtualenv work?

相关问题 更多 >