当前位置: 首页 > 工具软件 > Python ispy > 使用案例 >

python2.7怎样运行_有没有一种方法可以强制Python程序在2.7版中运行?

卢普松
2023-12-01

背景

我有一些Python脚本使用仅适用于Python 2.7的库,因此我希望能够在Python 2.7版中运行这些脚本。

我当时想,如果可以在Python文件的顶部放置一些代码来检测它是否在Python 3中运行,并在2.7版中执行,那将是很棒的。 这可能吗?

例如,伪代码为:

1

2

3if (self.getPythonVersion != 2.7):

os.execute('python27 ' + os.cwd + 'script.py')

exit()

编辑:这是供我个人使用,而不是分发。

回答

我使用下面的吉尔森的答案来使它对我有用。 我无法使os.exec()工作,但是我并没有花很长时间。 第二个脚本对我有用。 这是我为我使用和工作的内容:

1

2

3if sys.version_info[:2] > (2, 7):

code = subprocess.call(['python27', sys.argv[0] ])

raise SystemExit(code)

你为什么要这样做?

我同时安装了python版本和某些脚本使用仅适用于Python2.7的库,因此我需要在Python 2.7中运行它们

那你现在如何运行它们?通常我会执行python2 script.py来运行脚本,所以我看不出这将是一个问题。

我使用.bat文件指定python27。我想使其能够通过双击运行。原因是因为我与同事共享了这些脚本,因此最好不必执行任何其他步骤来运行脚本。

"与同事共享这些脚本"在某种程度上是分布式的,打开.py文件所使用的默认程序完全基于运行它们的计算机的设置。您正在使用第3方的这些库吗?如果是这样,您如何确定您的同事也安装了这些库。如果要创建"单击运行"应用程序,则只需将其打包到.exe中。

@ TadhgMcDonald-Jensen将其打包为.exe是一个好主意,但在我的情况下也不理想,因为我将其分发给的人都希望访问该脚本。我当时正在考虑为python27进行.py2扩展,但是这种方法是迄今为止最可取的。

无论如何,我只是想为与我一起工作的人提供更多便利。

不,由于用户可能已安装python3.x而未安装python2.x的简单原因,这是不可能的。

如果您知道他们已经安装了python2.7,则可以使用上面的替代方法,但是在这种情况下,必须确保您可以同时支持python3.x和python2.x。相同的来源(通常是一项艰巨的任务)

您可以通过sys.version_info检测python版本,并且我认为您可以使用os.exec*函数族中的某些内容来替换该过程...

例如。:

1

2

3

4import os, sys

if sys.version_info[:2] > (2, 7):

os.execve('python27', sys.argv, os.environ)

这是您可以尝试的另一种变体(它将创建一个新过程而不是替换旧过程):

1

2

3

4

5

6

7import sys, subprocess

if sys.version_info[:2] > (2, 7):

code = subprocess.call(['python27'] + sys.argv)

raise SystemExit(code)

print(sys.version_info)

我没有考虑将其分发给其他人。这仅供我个人使用,并且确实安装了两个版本。 python27是PATH中我的Python 2.7可执行文件的名称。

我收到一个错误消息,说Python崩溃了。如果我可以使它起作用,我将在周围玩耍并将其标记为答案。

得到它的工作。我必须使用第二种解决方案,使用os.execve(或execlp / execvp)的第一种方法将不起作用,否则将导致Python崩溃。无论如何,这很棒。谢谢!病态张贴我在问题中使用的脚本,以便其他人看到。

您可以尝试在脚本顶部添加python2.7 shebang行:

1#!/usr/bin/env python2.7

但是请确保它在您的路径中,并且此方法应该起作用。

这仅意味着直接执行时将使用python 2.7,不会阻止用户直接使用python 3运行。

@ TadhgMcDonald-Jensen我明白了,谢谢您提供的有用信息。

我认为在usrbinenv中查找更可靠-对我来说binenv不存在(OS-X El-Capitan)。

Windows是否具有等效功能?我没有在问题中指定使用的操作系统。可悲的是,它不是Linux:P。

@Klik,除非您在Windows上运行Cygwin,否则没有。见stackoverflow.com/questions/7574453/

这种丑陋的技巧应该适用于大多数UNIX类系统exec-magic。它依赖于python和sh之间的三重引用处理差异。首先sh运行脚本,然后使用合适的python二进制文件(如果找到)重新运行脚本。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23#!/bin/sh

_HACK_='''________BEGIN_SH_CODE_____________'

ispy2() {

case $1$2$3$4$5$6$7$8$9 in

*ython2.*) return 0 ;;

*) return 1 ;;

esac

}

for c in python python2 python3 \

/usr/local/bin/python* \

/usr/bin/python* \

/bin/python*

do

ispy2 `$c -V 2>&1` && exec $c"$0""$@"

done

echo"could not find python 2 binary"

exit 1

_HACK_='________BEGIN_PYTHON_CODE___________'''

import sys

print sys.version

print sys.argv

讨厌的ispy2()函数是一种黑客,可以在出现不同的单词拆分行为时(/bin/sh之外的任何二进制文件)从python -V输出中删除空格。

我会因为mgilson提出的理由而反对这样做。但是,您可以使用以下命令检查python版本:

1

2import sys

sys.version_info[0]

如果您仍然想要这样做。

然后,在检测到该脚本已在版本3中运行后,如何在Python 2.7中运行该脚本?

 类似资料: