从Python脚本中更改Python执行版本

是否可以在脚本中更改
Python的执行版本?

我有Python 2.6.6默认加载.我想将此版本更改为3.6.0,它安装在脚本内的自定义位置(不是/usr/bin).因此,在脚本中,我将使用sys.version检查Python版本,将在脚本中加载Python 3.6.0模块.它没有反映在运行环境中.这是代码:

import sys, os
pyVersion = int(sys.version.split(" ")[0].replace(".", ""))
exec(open(os.environ['MODULESHOME']+"/init/python.py").read())
if pyVersion < 360:
    print("Python 3.6.0 version required")
    print("Loading utils/python module")
    module(['load', 'utils/python/3.6.0'])
    module('li')

它按预期列出模块.输出:

Python 3.6.0 version required
Loading utils/python module
Currently Loaded Modulefiles:
1) licenses                    2) cliosoft/6.32.p3(default)   3)utils/python/3.6.0

现在,当我在下一行检查python版本时,它仍然是python 2.6.6

print(sys.version)

输出:

2.6.6 (r266:84292, Jul 23 2015, 15:22:56) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)]

现在,如何在加载模块后让Python使用3.6.0代码行?

NOTE: I can change version before loading the script. But, it will be used by multiple users and I don’t have root access. So, not possible to change version for every one. And I’m interested in doing it this way only.

最佳答案 在您的最新评论中,您提到了“HERE DOC”的使用.在Python中,这些被称为“文档字符串”,并被写为三个引号(“”“).关于您的问题,它们可以如下使用:

#!/usr/bin/env python

# Python 2
import os
import sys
print "1. Python version: ", sys.version
print "2. Process id: ", os.getpid()

os.execlp("python3", "python3", "-c", """

# Python 3
import os
import sys
print("3. Python version: ", sys.version)
print("4. Process id: ", os.getpid())
""")

print "5. Does not execute"

在我的机器上(Ubuntu 16.04),输出是:

1. Python version:  2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609]
2. Process id:  3085
3. Python version:  3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609]
4. Process id:  3085

(版本可能因机器而异.)

注意两件事:

>版本号从2. *变为3. *
>进程ID保持不变3085
> exec之后的行没有运行.实际上,exec命令“卸载”Python 2解释器.它不再是执行文件的其余部分.

根据某种定义,这可以被认为是“将Python 2. *改为3. *”.可以使用相同的方法将2.6.6更改为3.6.0.

最后,提醒一句.除非您的需求是可怕的,否则我建议不要使用上述技术.以下限制可能适用:

> exec的行为在平台之间变化很大.
>最大arg大小(Python 3字符串的大小)被硬编码到内核中.它可以小到几千字节.
>最后,我发现将大部分脚本置于文档字符串中令人作呕.

点赞