当 python 文件必须使用 #!/bin/env python 时处理多个 python 版本

2023-11-23

我有这个问题:

System A运行 Ubuntu 并需要Python 2.6对于一堆不同的事情。
我安装了Python 2.7分别于System A
System B has Python 2.7原生地。

我有一个 python 脚本BLAH其中说#!/bin/env python上面。
再往下执行另一个脚本SIGH,上面还说:#!/bin/env python.

BLAH需要在任一上运行System A or System B,并且它总是需要运行Python 2.7

----
到目前为止我的解决方案的一部分:
有一个包装脚本,首先尝试查看是否which python指向Python 2.7
如果可以的话就运行BLAH与 python 的路径。
不然试试which python2.7并使用该路径运行BLAH,并将该路径添加到env PATH.

该解决方案的问题是:

On System A(单独安装了Python 2.7)
When BLAH执行时,由于我编写了包装器脚本,它使用 Python 2.7 运行(到目前为止还好..)
When BLAH spawns SIGH, SIGH使用 shebang 在路径中查找 python 然后遇到麻烦,因为它正在寻找 pythonenv's PATH它应该寻找python2.7在路径中。

有没有一种干净的方法来处理这个问题?

提前致谢!


如果你有一个需要特定 python 版本的脚本,例如 2.7,我会将第一行更改为

#!/bin/env python2.7

然后确保python2.7在您的路径上(您可能需要根据需要添加符号链接)。在我使用过的所有发行版中,这些符号链接已经存在。

(实际上,python通常是一个符号链接pythonX这是一个符号链接pythonX.Y或者,就我而言,python -> python2 -> python2.7. )

无需硬编码完整路径,因为这可能因发行版或盒子而异。

但是,由于名为的路径上的可执行文件不应该有歧义python2.7,您应该没问题,而不必担心硬编码路径。

或者,在第一个脚本中,您可以直接调用 python 解释器,如下所示:

subprocess.Popen(['pythonX.Y', SCRIPT_NAME])

代替

subprocess.Popen([SCRIPT_NAME])

EDIT正如 J.F. Sebastian 在评论中指出的那样,您可以使用系统可执行文件在第一个参数中,以确保第二个脚本传递给与第一个脚本相同的解释器。例如

subprocess.Popen([sys.executable, SCRIPT_NAME])

顺便说一句,这可能有用也可能没用,您可以访问“当前”Python 解释器的版本inside脚本由

import sys
print(sys.hexversion)

这可能有助于确定正确的解释器是否正在运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 python 文件必须使用 #!/bin/env python 时处理多个 python 版本 的相关文章

随机推荐

  • 错误:灵活数组成员不在结构末尾

    我的结构如下所示 typedef struct storage char data int lost index int lost index size int size int allowed memory key size int al
  • 为什么SetupDiCallClassInstaller函数仅限于64位程序?

    尝试从以 32 位模式编译的程序调用 SetupDiCallClassInstaller 在 64 位 Windows 上失败 显然这是设计使然 但我想知道原因 根据 MSDN 64 位系统上的设备安装 32 位版本的应用程序必须检查 Up
  • Eclipse:我打开了隐藏角色,现在无法关闭

    不知何故 我在 Eclipse 中打开了隐藏字符 它不是一般编辑器首选项中的 空白 字符 打开后 它会在现有字符的基础上添加另一层隐藏字符 然后我有类似的事情 r n 有谁知道这些是什么以及如何删除它们 它位于 首选项 gt 常规 gt 编
  • UIWebView 中的 Cookie

    我有一个 UIWebView 我不希望它存储 cookie 所以在加载 webview 之前我会这样做 NSArray cookies NSHTTPCookieStorage sharedHTTPCookieStorage cookies
  • C++ 将对象写入文件然后再读入? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在c 中进行序列化 如何在C 中实现序列化 这些天我越来越多地使用 C 并且目前只对 ofstream 有过一些体验 大多数上述经验都是对变量进行简单的文件输出并使用 ifstream 读回它们
  • HTML5 游戏(画布)- UI 技术?

    我正在使用 PhoneGap 为移动设备 Android iPhone WebOS 构建 JavaScript HTML5 游戏 使用 Canvas 我目前正在尝试设计如何构建 UI 和游戏板以及它们如何交互 但我不确定最好的解决方案是什么
  • 使用 Git Gui Windows - 如何保存用户凭据 - 用户名和密码

    我知道这个问题之前已被问过 并且我一直在查看此链接 https www kernel org pub software scm git docs git credential store html 总的来说 我对使用适用于 Windows
  • 在最近的时间戳上合并两个 pandas 数据帧

    我有两个 daframe df1 和 df2 df1 is time status 2 2 2015 8 00 am on time 2 2 2015 9 00 am canceled 2 2 2015 10 30 am on time 2
  • 算法帮助:如何将数组划分为N个段,且最大段最少(平衡分段)

    我在一个俄语编程论坛上遇到了这个问题 但还没有想出一个优雅的解决方案 Problem 你有一个数组N 个正整数 你需要把它分成M 个连续段 使得最大段的总和是最小的可能值 我所说的段总数是指其所有整数的总和 换句话说 我想要一个平衡良好的数
  • 在一个事务中调用多个 SQL Server 存储过程

    为了在我当前的项目中使用 我创建了一个允许我调用 SQL Server 异步的类 我的代码如下所示 internal class CommandAndCallback
  • ASP.Net URLEncode & 符号用于查询字符串

    我需要重定向到一个 url 将参数作为查询字符串传递 这可以在值中包含 符号 例如 string value This That Response Redirect http www example com Value Server Url
  • 看起来很有趣的评论 - C++

    当我阅读开源项目的源文件时 我经常在评论中遇到一些奇怪的短语 brief usage remarks par 问题1 它们是什么 我学c 的时候没有提到 2 他们有任何文件吗 在哪里 它们只是注释 因此在 C 中没有特殊含义 他们可能允许文
  • 需要在MongoDB中存储高精度十进制值

    我对 MongoDB 的经验很少 我通常从事大型 SQL Server 数据库的工作 MongoDB 仅支持 double 和没有小数 C 驱动程序将小数序列化为字符串 如果我将小数存储为字符串 我会错过什么功能 MongoDB 有没有办法
  • 显示隐藏的 WPF 窗口

    在 WPF 窗口中我想隐藏它 使用显示另一个窗口ShowDialog然后取消隐藏第一个窗口 当我这样做时 this Hide var window2 new Window2 window2 ShowDialog this Show 第一个窗
  • 如何从在线 UML 模型生成 Java?

    我需要在线创建 UML 类图并从中生成 Java 代码 像 cacoo 这样的绘图工具不允许生成代码 因为它们不是真正的 UML 建模器 有人知道生成 Java 代码的 UML 在线工具吗 谢谢你的帮助 你应该看看 GenMyModelUM
  • 解决类似 Flood-It 难题的最少点击次数

    我有 N M 网格 其中每个单元格都用一种颜色着色 当玩家单击颜色为 的网格中的任何单元格时 颜色为 的网格左上角的单元格将接收颜色 但不仅如此 所有通过以下方式连接到源的单元格仅使用颜色 或 的路径也会接收颜色 单元之间的连接应仅在水平和
  • 在dos批处理脚本中检测sqlplus错误?

    我们有以下批处理脚本 echo release sql echo exit sqlplus x y orcl if errorlevel gtr 1 goto dberror 问题是 声明if errorlevel gtr 1当出现 sql
  • ASP.NET MVC 语言更改链接

    我有一个 ASP NET MVC 站点 它使用资源以两种语言显示 为了允许服务器以适当的语言显示站点 取决于用户浏览器中配置的语言 我将以下内容放入 web config 中
  • 为什么使用 HTML5 语义标签而不是 div? [复制]

    这个问题在这里已经有答案了 为什么使用 HTML5 语义标签headers section nav and article而不是简单地div与首选的css to it 我创建了一个网页并使用了这些标签 但它们与div 他们的主要目的是什么
  • 当 python 文件必须使用 #!/bin/env python 时处理多个 python 版本

    我有这个问题 System A运行 Ubuntu 并需要Python 2 6对于一堆不同的事情 我安装了Python 2 7分别于System A System B has Python 2 7原生地 我有一个 python 脚本BLAH其