当前位置: 首页 > 知识库问答 >
问题:

Shebang 用于在 pyenv virtualenv 下运行的 Python 脚本

夹谷飞龙
2023-03-14

当一个python脚本应该从pyenv虚拟环境运行时,该文件的正确Sheang是什么?

作为一个示例测试用例,我的系统(OSX)上的默认python没有安装熊猫。pyenv虚拟环境venv_name可以。我试图从虚拟环境中获取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

< br >尽管在命令行上运行该路径工作正常:

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

(venv_name) $ python script.py # also works
success

什么是合适的sheang?理想情况下,我想要一些通用的东西,这样它就可以指向我当前venv的python。

共有3个答案

冯德佑
2023-03-14

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

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

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

你可以在这里看到更多。

秦雅逸
2023-03-14

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

在您的问题的评论中,VPfB

另请参阅:https://UNIX . stack exchange . com/questions/209646/how-to-activate-virtualenv-when-a-python-script-starts

尝试<code>pyenv virtualenvs</code>查找虚拟环境目录列表。

然后你可能会发现一个像这样的东西:

#!/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会在该二进制文件的路径位置周围寻找支持文件,并最终使用周围的虚拟环境。(参见does virtualenv如何工作?)

王扬
2023-03-14

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

#!/usr/bin/env python

这样,您可以在环境中搜索python解释器来使用。

 类似资料:
  • 问题内容: 当应该从python运行脚本时 ,文件的正确Shebang是什么? 作为示例测试用例,尚未安装我的系统(OSX)上的默认python 。pyenv virtualenv可以。我试图从virtualenv获取python可执行文件的路径。 所以我举了一个例子: 但是,当我尝试运行脚本时,出现错误: 尽管在命令行上运行该路径可以正常工作: 什么是适当的shebang?理想情况下,我想要一些

  • 问题内容: 我通常在Python脚本中使用以下shebang声明: 最近,我遇到了这个shebang声明: 在脚本文档中,已指出使用此表单“更具可移植性”。 这个声明是什么意思?路径中间为什么会有空间?它实际上有助于提高可维护性吗? 问题答案: 之所以具有更高的可移植性,是因为该程序通常可用于在没有完整路径的情况下“激活”所需的命令。 否则,您将必须指定Python解释器的完整路径,该路径可能有所

  • 问题内容: 我有一个在Linux上运行的Python(3)脚本,称为主脚本,该脚本必须从专有DLL调用例程。到目前为止,我已经使用Wine使用以下结构解决了这个问题: 脚本 dll_call.py 由Wine下安装的Windows Python(3)解释器执行。它将返回值转储到一个文件中,然后由等待的主脚本拾取该文件。如果我必须连续执行几次,它不是完全可靠且令人痛苦的缓慢。 我想一次启动脚本 dl

  • 问题内容: 在我看来,没有该行,文件运行相同。 问题答案: 如果你安装了多个版本的Python,请确保使用的解释器是环境中的第一个解释器。另一种方法是对类似的东西进行硬编码可以,但是不太灵活。 在Unix中,要解释的可执行文件可以通过#!在第一行的开头加上,然后是解释器(及其可能需要的任何标志)来指示要使用的解释器。 当然,如果你在谈论其他平台,这个规则是不适用的(但是“shebang行”没有坏处

  • 问题内容: 这可能是一个非常简单的问题,但是如何每两天在我的fedora dist上运行一个python脚本? 谢谢 安东尼斯 问题答案: 这是关于cron的问题。首先是在python脚本顶部添加SHEBANG行。 使您的脚本可执行 然后执行crontab -e并添加

  • 问题内容: 当类似Bash的脚本以二进制形式执行而没有shebang时,如何确定由谁执行? 我猜想 使用 shebang 运行普通脚本是由binfmt_script Linux模块处理的,该模块检查shebang,解析命令行并运行指定的脚本解释器。 但是,如果有人在没有脚本的情况下运行脚本会发生什么?我已经测试了直接方法,发现里面没有内核魔术,即像这样的文件: 运行仅执行调用的已编译C程序将产生: