【问题标题】:Running multiple pythons运行多个 python
【发布时间】:2015-02-01 07:45:15
【问题描述】:

我最近升级到 python 3.4 以使用 continuum 工具,但我的许多脚本都是为 2.7 编写的。这可能会导致一些错误;有些很简单(比如“print”现在需要括号),但有些更复杂:

if struct.unpack("h", "\0\1")[0] == 1:
  defs.append(("WORDS_BIGENDIAN", None))

产生错误:

  File "setup.py", line 302, in build_extensions
    if struct.unpack("h", "\0\1")[0] == 1:
    TypeError: 'str' does not support the buffer interface

有没有办法像使用 C++(-std=c++11 等)一样将我的 python 代码运行为 2.x?如果我只解决这个问题,可能会出现更多错误。谢谢!

【问题讨论】:

  • 我认为不是。你必须移植它。但有一些工具可以做到这一点。
  • python 3 附带的2to3.py 转换器将尝试为您更新代码,例如。但您可能还需要自己完成一些工作。
  • @ACSutton 请记得为有用的答案和 cmets 投票,并将解决您问题的答案标记为“已接受”。
  • 感谢您链接到该答案!我没有看到它,但我仍然认为这个问题是相关的,原因有几个:我需要维护两个版本;这是特定于 linux 的;此处提供的答案对其他人有用。

标签: python linux software-distribution


【解决方案1】:

如果您安装了多个版本,您可以更改 Python 脚本的第一行以明确使用 2.x 或 3.x:

对于 python 2.x 脚本:

#!/usr/bin/env python2

或者,对于 python 3.x 脚本:

#!/usr/bin/env python3

【讨论】:

  • 你能确认这行得通吗?我收到一个错误“bash: ./program_name.py: Permission denied”
  • 是的,我刚刚在我的 shell 中尝试过这个。请注意,这只有在您的系统上同时安装了 python2 和 python3 时才有效。同样,从控制台运行 python 时,您可以通过调用 python2python3 显式运行交互式 python 会话。
  • 谢谢,但我仍然收到错误消息。我正在尝试将 Image 模块添加到我的 Python 3.4 发行版中,但除了在 Python 3.4 中没有明确支持之外,它可能根本不起作用......
  • 尝试在控制台中运行which python2,并在脚本的第一行使用返回的路径。
  • 好的,你的回答让我重新思考我想要做什么,我认为我最初的目标是不可能的——我不能使用 python2 来安装 python3 的模块。我需要实际的安装脚本是 python3 可调用的。听起来对吗?
【解决方案2】:

Python 3 确实是与 Python 2 不同的语言。无法让 Python 3 解释器运行 Python 2 代码(除非该代码碰巧没有使用任何已更改的功能)。

您可能需要阅读 Python 文档中的 guide to porting to Python 3。以下是当前建议的简要摘要:

  • 如果您从现在开始只需要支持 Python 3(您不需要维护 Python 2 的兼容性),请使用 2to3 工具翻译您的大部分代码,然后手动修复它遗漏的任何内容。如果您以前没有使用过 Python 3,那么有很多文档解释了版本之间的变化。
  • 如果您正在编写新代码并且需要能够在两个 Python 版本上运行它,请为 Python 3(或 2 和 3 的公共子集)编写并根据需要向后移植到 Python 2。
  • 如果您有一个现有的 Python 2 代码库,并且希望在不破坏 Python 2 兼容性的情况下在 Python 3 上运行它,请使用 sixfrom future 导入等库来帮助您将代码移植到两者的公共子集Python 的版本。 2to3modernize 等其他工具将帮助您找到可以改进的地方。请注意,如果您放弃对旧版 Python 2 的支持,这项工作会更容易完成。

【讨论】:

  • 不幸的是,情况确实如此。 2to3 似乎是一个非常不完善的工具。我将使用“six”和“fromfuture”来看看这些是否有帮助。
猜你喜欢
  • 1970-01-01
  • 2011-04-30
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 2021-04-22
  • 1970-01-01
相关资源
最近更新 更多