一个 python 脚本可以同时运行 python 2.x 和 python 3.x

2024-03-05

我有数千台服务器(linux),有些只有 python 2.x,有些只有 python 3.x,我想编写一个脚本 check.py 可以在所有服务器上运行,就像 $./check.py 一样,无需使用 $ python check.py 或 $python3 check.py,有什么办法可以做到这一点?

我的问题是脚本 check.py 如何找到解释器,无论解释器是 python2.x 还是 python3.x


许多脚本可以在 2.x 和 3.x 上运行。 (我每天都有很多工作要做,并且我已经将各种开源库从纯 2.x 转换为双版本。)

有几件事让它变得更容易:

  • 2.x 用户需要 2.7 或至少 2.6+。否则,例如,您无法使用参数引发异常或将它们捕获到变量中,以及其他此类严格的限制。
  • 对于 3.x 用户,需要 3.3+,或至少 3.2+。大多数无端的不兼容性(例如u前缀被去掉)在 3.2 或 3.3 中被颠倒。
  • Use the six http://packages.python.org/six/图书馆。
  • Use __future__声明。
  • 头脑中始终清楚你的意思是bytes(始终为 8 位),unicode(如果您想要 8 位,则必须编码),或者str(无论大多数 stdlib API 期望什么),以及encode and decode有必要的。
  • 定期运行2to3在你的代码上。 (但是不要盲目地按照它所说的去做。例如,如果您正在使用d.keys() or map(f, l)因为你不在乎是否能回来list或不,你会收到警告,因为2to3不知道你不在乎。)

或者,不要尝试编写在两者上运行的代码,而是编写在 2.x 上运行但可以自动转换的代码2to3运行 3.x 代码,并将其作为安装过程的一部分(在setup.py, if sys.version_info >= (3, 0): do the 2to3 step).

从您的编辑来看,听起来您最关心的是在 # 中放入什么内容!线。为了那个原因:

/usr/bin/env python

这并不能保证有效——但是之后env并不能保证一开始就能工作……您可以相信以下事实:

  • 在平台/发行版仅提供 2.x 的几乎任何系统上,python是Python 2。
  • 在平台/发行版提供两者的几乎任何系统上,python是Python 2。
  • 在平台/发行版仅提供 3.x 的几乎任何系统上(目前非常罕见,但可能最终会更加常见),python是Python 3。

However:

  • 在平台提供的系统上neither,如果管理员只安装了 3.x,则很可能(截至 2013 年初)not可以作为python。对此你无能为力。

如果最后一个是一个严重的问题,您可以通过添加一个用 sh 编写的启动器脚本来解决它,该脚本会尝试python然后尝试python3如果失败了。

执行此操作的好方法是将启动器脚本本身指定为 Python 脚本中的 shebang 解释器。 Linux 可以处理这个问题,但它是可配置的,并且至少有一些发行版默认禁用它,而大多数其他 *nix 系统则无法做到这一点。

如果这不起作用,下一个最佳选择是让用户运行启动器脚本,也就是说,告诉他们这样做./check.sh代替./check.py, and check.sh找出正确的Python解释器并运行$python ./check.py对于用户来说。

如果你想变得更棘手,你甚至可以将 Python 脚本作为定界文档嵌入到 shell 脚本中,这样你只需要分发一个文件。他们跑./check.sh,它会找到正确的 Python 并在 Heredoc 上运行它。

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

一个 python 脚本可以同时运行 python 2.x 和 python 3.x 的相关文章

随机推荐

  • 函数内部与外部循环的速度差异

    Out of 这个帖子 https stackoverflow com questions 53971364 split a vector and summing values 53971606 53971606在对各种解决方案进行基准测试
  • 在 SQL Server 2012 上运行 DTS 包

    我读到 SQL Server 2012 不支持 DTS 包 我知道有一个向后兼容性包 选项 我们用于 SQL Server 2008R2 来运行 DTS 包 该向后兼容包不适用于 SQL Server 2012 吗 2008 R2http
  • JQuery 动画在 Internet Explorer 中不起作用

    我在使这个 JQuery 在 Internet Explorer 中工作时遇到了一些麻烦 它在 FF WebKit 等中工作得很好 向上滑动 弹起并落回原位 但在 Internet Explorer 中它什么也不做 按钮不起作用并且内容在页
  • didCreatePaymentResult stripeID 是一个card_ token,似乎无法保存给客户

    我有一个 swift iOS 应用程序 它要求用户提供应用程序中付款和未来付款的付款详细信息 它使用带有 Apple Pay 的 stripe SDK 并且似乎都已正确设置 我有以下方法 func paymentContext paymen
  • 检查类常量是否存在

    如何检查 PHP 类中是否定义了常量 class Foo const BAR 1 有没有类似的东西property exists or method exists 对于类常量 或者我可以使用defined Foo BAR 您可以使用以下代码
  • 根据 GPS 坐标将 Google 地图嵌入 HTML 页面

    我有一个 PHP 照片库 可以从图像中读取 GPS 坐标 我想修改它以使用坐标并在照片页面上包含谷歌地图 有没有一种简单的方法可以通过仅提供这对信息来在 HTML 页面上显示谷歌地图 Thanks 以下是一些可以帮助您入门的示例 使用谷歌地
  • 当我指定机器名时,无法在自己的机器上查询SystemIndex

    我正在尝试编写一个简单的程序来连接到远程计算机并查询索引状态 这是在我的机器上执行此操作的代码 这工作正常 using System using Microsoft Search Interop namespace IndexStatus
  • NServiceBus升级到3.3.8版本后出现WebException错误404

    我刚刚将 NServiceBus 解决方案更新到版本 3 3 8 我之前的版本是3 2 2 当我运行我的解决方案时 我收到以下错误 发生Web异常 远程服务器返回错误 404 未找到 发生 System Net WebException H
  • 将 csv 中的列转换为日期 powershell

    我有一个与此类似的 csv fundName MMFcusip ticker AsOfDate SumHoldingPercent BlackRock OH Muni MMP Instit 091927236 COIXX 2 29 2012
  • 在 LISP 中如何检查闭包中的自由变量?

    在 lisp 中 我可以像这样绑定在闭包中绑定的自由变量 let x 1 y 2 z 3 defun free variables x y z free variables 结果是 6 我想知道是否可以动态检查绑定的闭包变量 E g ins
  • 嵌入 python 错误 不支持按文件名导入

    我正在尝试将 python 嵌入到我的应用程序中 但很早就陷入了困境 我将 python 嵌入到我的 C 应用程序中并使用本教程中找到的代码 http docs python org 2 extending embedding html p
  • Android:使用 DrawableCompat 着色

    我正在尝试对 Android API 级别 21 之前的图像进行着色 我已经使用以下方法成功对项目进行了着色
  • XHR跨域限制的目的是什么?

    我一直想知道XHR跨域限制的目的是什么 其目的似乎是防止恶意注入的 Javascript 将私有数据发送给攻击者 然而 通过注入可以轻松地将数据发送到任何域script or img标签 或任何其他与此相关的外部资源 如果任意网站可以对您的
  • django Rest框架::传递原始查询

    是否可以在 django Rest 框架 如 django rest 中执行原始查询 https docs djangoproject com en dev topics db sql performing raw queries http
  • 在平板电脑模式下在最上面启动另一个应用程序

    当我从应用程序运行另一个 exe 时 它 在后台启动 并且不会在屏幕顶部显示该应用程序 而是显示平板电脑模式主屏幕 它在正常桌面模式下工作正常 但当我在 Windows 10 平板电脑模式下运行它时它不会显示在顶部 而是在后台启动 我用过m
  • 什么是UUID?

    嗯 什么是一 它是唯一标识某物的标识号 这个想法是 id 号码将是普遍地独特的 因此 任何两个事物都不应该具有相同的 uuid 事实上 如果您要生成 10 万亿个 uuid 则两个 uuid 相同的概率为 0 00000006
  • 模块自动加载就意味着可靠吗?

    环境 我有以下文件夹结构 用于保存 powershell 模块 C PsModules util util psm1 this contains implementation of Test Function util test ps1 f
  • 将枚举值映射到 TypeScript 中的各个类型

    我有一段 TypeScript 代码 如下所示 enum EventType EVENT A eventA EVENT B eventB more event types interface Event type EventType int
  • 在 Android 上开发电子邮件客户端应用程序

    我正在尝试开发一个用于在Android平台上发送和接收电子邮件的小应用程序 目前我一直在使用 Javamail api 尝试发送电子邮件 但是我想 如果我使用 javamail 实现我的应用程序 我将如何接收电子邮件并从我的应用程序收到我已
  • 一个 python 脚本可以同时运行 python 2.x 和 python 3.x

    我有数千台服务器 linux 有些只有 python 2 x 有些只有 python 3 x 我想编写一个脚本 check py 可以在所有服务器上运行 就像 check py 一样 无需使用 python check py 或 pytho