我必须在Windows服务器上运行Python脚本.我怎么知道我拥有哪个版本的Python,甚至真的很重要?我正在考虑更新到最新版本的Python.
我有一个Python文件,可能必须支持Python版本<3.x和> = 3.x. 有没有办法反省Python运行时知道它正在运行的版本(例如2.6 or 3.2.x)?
如果我的Python脚本至少需要特定版本的Python,那么在使用早期版本的Python启动脚本时,正确失败的正确方法是什么?
如何及早获得控制权以发出错误消息并退出?
例如,我有一个使用ternery操作符(2.5中的新增内容)和"with"块(2.6中的新增内容)的程序.我写了一个简单的小解释器 - 版本检查器例程,这是脚本会调用的第一件事......除了它没有那么远.相反,在我的例程被调用之前,脚本在python编译期间失败.因此,脚本的用户会看到一些非常模糊的synax错误回溯 - 这几乎需要专家推断它只是运行错误版本的Python的情况.
我知道如何检查Python的版本.问题是某些语法在旧版本的Python中是非法的.考虑这个程序:
import sys
if sys.version_info < (2, 4):
raise "must use python 2.5 or greater"
else:
# syntax error in 2.4, ok in 2.5
x = 1 if True else 2
print x
Run Code Online (Sandbox Code Playgroud)
在2.4下运行时,我想要这个结果
$ ~/bin/python2.4 tern.py
must use python 2.5 or greater
Run Code Online (Sandbox Code Playgroud)
而不是这个结果:
$ ~/bin/python2.4 tern.py
File "tern.py", line 5
x = 1 if True else 2
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
(引导同事.)
我正在运行Ubuntu 9:10,并安装了一个名为M2Crypto的软件包(版本为0.19.1).我需要下载,构建和安装最新版本的M2Crypto软件包(0.20.2).
0.19.1包具有多个位置的文件,包括(/ usr/share/pyshared和/usr/lib/pymodules.python2.6).
如何在安装0.20.2之前从我的系统中完全卸载0.19.1版本?
我在python中有一个函数可以返回a bool或a list.有没有办法使用类型提示指定返回类型.
例如,这是正确的方法吗?
def foo(id) -> list or bool:
...
Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用匹配大小写而不是一百万个 IF 语句,但我尝试的任何操作都会返回错误:
match http_code:
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
我还尝试过测试我发现的示例,这些示例也会返回此错误,包括以下错误:
http_code = "418"
match http_code:
case "200":
print("OK")
case "404":
print("Not Found")
case "418":
print("I'm a teapot")
case _:
print("Code not found")
Run Code Online (Sandbox Code Playgroud)
我知道匹配案例对于 python 来说是相当新的,但我使用的是 3.10,所以我不确定为什么它们总是返回这个错误。
我想做一些类似的String.Format("[{0}, {1}, {2}]", 1, 2, 3)回报:
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
我如何在Python中执行此操作?
我正在尝试编写一个前向兼容程序,我想知道处理需要不同导入的情况的"最佳"方法.
在我的具体情况下,我使用ConfigParser.SafeConfigParser()Python2 configparser.ConfigParser()中的Python2.
到目前为止,我已经通过在导入时使用try-except或在Python(使用sys)版本上使用条件来使其工作.两者都有效,但我想知道是否有推荐的解决方案(也许还有一个我尚未尝试过).
ETA:谢谢大家.我用过six.moves没有问题.
如果我做了一个模块,我想作为在Python 3运行在Python 2相同,有一吨的选项包括six,futures,和2to3。如果更改的数量很少,那么这些工具中的每一个都有足够的怪癖,我倾向于只为我的模块实际使用的少数不兼容功能编写兼容接口。
实现这一点的合理标准方法是使用简单的版本检查。
import module_bar
if sys.version_info >= (3,):
uniformly_named_foo = module_bar.py3_thing
else:
uniformly_named_foo = module_bar.py2_thing
Run Code Online (Sandbox Code Playgroud)
是否有任何奇怪的情况sys.version_info不会正确报告?过去,我已经被格式错误的路径、配置、安装、修改以及诸如此类的东西所困扰,以至于我觉得这不是我应该信任的事情。
当我们深入研究它时,我真正关心的是是否实现了特定功能。在 Web 开发中,嗅探用户代理通常被认为是一种不好的做法。相反,应该尽最大努力确定某个特定功能是否正在使用中。根据功能的不同,有很多方法可以实现这一点。
if hasattr(module_bar, 'py3_thing'):
uniformly_named_foo = module_bar.py3_thing
else:
uniformly_named_foo = module_bar.py2_thing
Run Code Online (Sandbox Code Playgroud)
在我的机器上,第二条路线慢两倍(对于一次性操作来说,额外的几百纳秒并不重要),但它似乎没有任何其他主要缺点。还是有优势?是否存在第二种方法会成功而第一种方法会失败的 Python 安装?
python ×10
python-3.x ×3
version ×2
django ×1
formatting ×1
import ×1
module ×1
packages ×1
python-2.7 ×1
python-3.5 ×1
return-type ×1
string ×1
type-hinting ×1