【问题标题】:How to make the Shebang be able to choose the correct Python interpreter between python3 and python3.5如何让 Shebang 能够在 python3 和 python3.5 之间选择正确的 Python 解释器
【发布时间】:2018-06-01 15:34:39
【问题描述】:

我正在 python3 中开发一组脚本,因为 shebang 我使用这个:

#!/usr/bin/env python3

一切正常,但在某些执行的虚拟机中,解释器的名称是python3.5。我希望能够在两个环境中执行我的脚本,但我无法更改虚拟机的文件系统(所以我放弃了从 python3.5 到 python3 的链接等解决方案)

我查看了env 的人,但我找不到任何方法来指定搜索模式或类似的东西。

我尝试在会话开始时设置一个 alias 指向正确的 python 解释器,但 env 不使用它。

我独特的解决方案是调用我的脚本,说明必须使用哪个解释器,但很烦人:

python3.5 myscript.py

欢迎任何想法!,谢谢!

【问题讨论】:

  • 哪个可怜的发行版只安装了python3.5,并没有把它本身变成python3的符号链接?
  • 如果您无法将脚本存储在磁盘上,您将如何安装它们?
  • @tripleee 好问题!,我在 r/w 区域从 subversion 结帐......这是真的,我无法更改已安装的系统,但我可以创建一些中间脚本
  • 你为什么不创建一个'bootstrap'脚本来检查你的.py文件并根据当前环境调整它们的shebang?

标签: python bash python-3.x shell shebang


【解决方案1】:

不需要引入单独的shell和python脚本,一个文件就可以了!

用这个序列替换你的 shebang 行:

#!/bin/sh

# Shell commands follow
# Next line is bilingual: it starts a comment in Python, and is a no-op in shell
""":"

# Find a suitable python interpreter (adapt for your specific needs) 
for cmd in python3.5 python3 /opt/myspecialpython/bin/python3.5.99 ; do
   command -v > /dev/null $cmd && exec $cmd $0 "$@"
done

echo "OMG Python not found, exiting!!!!!11!!eleven" >2

exit 2

":"""
# Previous line is bilingual: it ends a comment in Python, and is a no-op in shell
# Shell commands end here
# Python script follows (example commands shown)

import sys
print ("running Python!")
print (sys.argv)

【讨论】:

  • 非常感谢!这正是我想要的。而且我必须承认,这是一个非常巧妙的解决方法,再次感谢我的学习!
  • 我希望我能投票两次。这是一个非常好的答案,我一直在寻找一个很长一段时间。
  • 哇,这个代码是纯金的。修复了当 Python 2 是我无法控制的环境的默认设置时我必须运行 Python 3 的非常棘手的情况。干得好!
  • 我给了这个答案一个赞成票和一个“谢谢”(一些新的 SO 功能),我希望我能给出更多。即使在 2020 年,这对于处理需要较新版本 Python(例如 3.7 或 3.8)的可执行脚本也非常出色,并且必须处理旧操作系统会将它们作为 python3.7 / python3.8 的事实 - 但较新的操作系统可能会有它们就像python3
【解决方案2】:

如果您可以安装脚本,您还可以安装一个名为 python3.5 的包装器,它只是调度 python3

#!/bin/sh
exec env python3 "$@"

你显然需要chmod a+x这个脚本,就像你安装的其他脚本一样。

您必须将脚本的目录添加到您的PATH 系统python3.5 目录以避免进入无限循环,并且仅在以下情况下使用此脚本作为备用系统尚未提供python3.5

正如您所说,env 不知道也不关心您的个人 shell 别名或函数,也不提供任何动态计算二进制文件以自行运行;但是你可以使用 shell(当然还有 Python,一旦你找到它!)——它只是使用 PATH 所以如果你可以将你的其他脚本安装在你的 PATH 中的目录中(必须首先是#!/usr/bin/env shebang 的情况)您也可以将这个脚本存储在那里。

如 cmets 中所述,仅安装 python3.5 而不是至少可选地将 python3 设置为符号链接是很奇怪且对用户不利的,因此也许您最终可以说服维护您要安装的映像的人提供这个。

【讨论】:

  • 谢谢,但我无法更改虚拟机的文件系统,所以无法安装脚本
  • 无论你用#!/usr/bin/env python3.5 shebang 存储你的Python 文件,你也可以存储这个包装脚本。没有办法可以实现一个,但不能实现另一个。
  • 正如我所指出的,我无法更改系统,我只有一个可以写入的文件夹,我在那里签出我的脚本
  • 对。所以把这个脚本也存储在那里。
  • 也许实际上调用它python3 并让它调度python3.5 而不是相反。然后你可以保留#!/usr/bin/env python3,这在你的病态环境之外也是有意义的。
【解决方案3】:

如果已安装,您可以创建一个使用 python 3.5 的 shell 脚本,否则使用 python 3 并使用正确的版本执行您的脚本。
不需要 python shebang。
在你的 shell 脚本中,你可以测试which python3.5 是否返回一些东西;如果是,则安装 python3.5,否则您必须使用python3

【讨论】:

  • 谢谢,但我无法更改虚拟机的文件系统,所以无法安装脚本
猜你喜欢
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2019-01-25
相关资源
最近更新 更多