- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的一个项目使用 shlex.quote
,它从 python 3.3 开始可用。但是 shlex.quote
与 pipes.quote
相同,后者在移动到 shlex 后已弃用。
现在为了兼容性我正在使用这个代码:
def cmd_quote(string):
import sys
if int(sys.version[2]) < 3:
import pipes
return pipes.quote(string)
else:
import shlex
return shlex.quote(string)
是否存在更好的做法?
最佳答案
首先,如果您想对版本进行数值比较,请使用 version_info
, 不要尝试解析 version
.*
这也意味着您可以利用比较元组的方式并编写如下代码:
if sys.version_info < (3, 3):
…即使 Python 达到 3.10.0 或 4.0 也不会中断。
* 除非您需要担心 1.5 与 2.0,在这种情况下,您显然在 Usenet 和 StackOverflow 之间有一个时间机器网关,并且您肯定可以想到更好的用途。
无论如何,最好只测试一开始就存在的 shlex.quote
。这样,读者就可以清楚地知道您在做什么:如果可能,使用 shlex.quote
,如果不行,则回退到 pipes.quote
。
你会在所有地方看到这种模式——即使在标准库中,如果可能的话,代码是从 C 加速器模块导入的,但如果不是,则使用回退代码(例如,如果你使用 PyPy 而不是 CPython) .
另请注意,pipes.quote
仅 记录在 2.7 中。不是 3.0-3.2(这似乎是您关心的……),也不是 2.6 或任何其他版本。您依赖于特定实现中恰好存在的东西。 (好吧,实际上,在所有这些中,*但是,如果你不必依赖它,为什么还要依赖它呢?)
* 据我所知,没有任何 3.2 实现具有 pipes
和 shlex
但没有 pipes.quote
。 future 可能不会创建太多新的 3.2 实现。
此外,虽然在函数中间使用 import
偶尔会有用,但这样做有点奇怪。如果在您部署它的机器上安装有问题,您真的希望能够成功导入您的模块,但随后在调用某些函数时得到 ImportError
吗?人们对这种事情感到困惑,并一直跑到 SO 那里寻求帮助。 :)(在不需要时查看 sys.modules
并将字符串转换为 int 等,这显然也会对性能造成一些影响,但我怀疑这是否会重要。)
所以,我认为我会这样写:
try:
from shlex import quote as cmd_quote
except ImportError:
from pipes import quote as cmd_quote
关于Python 3 向后兼容性(shlex.quote 与 pipes.quote),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26790916/
sample = ",," values = shlex.shlex(sample, posix=True) values.quotes = '"' values.whitespace = ',' v
感谢 shlex 这种字符串,我想拆分: str = 'This doesn''t work' 54e+5 15 .FALSE. 'Another example of "test"' 预期结果: 这
我将 Popen 与 shlex 一起用于 yum 命令,并使用 --exclude 标志来传递要排除的软件包列表。由于某种原因,shlex 似乎没有保留双引号。有什么指示我该怎么做吗? >>> im
我需要将一系列字符串拆分为由空格表示的 3 个组成部分。这些字符串有时包含子列表,但始终作为字符串的最后一个组成部分。 我之前使用 Shlex 取得了巨大的成功,但我不再获得所需的结果,因为我最近的子
这个简单的代码: s = "it's a nice day..." s = shlex.split(s) 将导致 ValueError: No closing quotation错误: Traceba
我正在使用 shlex 解析 csv 文件,并且需要保留连续的空白字符,如下所示... line = 'a, b, "c, z",,,d,e,f' spltr = shlex.shlex(line)
我有以下文字: 'sudo -S java -cp spinn3r-client-3.4.06.jar com.spinn3r.api.Main --vendor=test --remote-filt
这个问题已经有答案了: How do I use subprocess.Popen to connect multiple processes by pipes? (9 个回答) 已关闭 7 年前。
如何使用 Python 的 shlex 拆分字符串,同时保留 shlex 拆分的引号字符? 示例输入: Two Words "A Multi-line comment." 期望的输出: ['Two'
语言:Python v2.6.2 操作系统:AIX 5.3 我正在使用 Python 将一些文件从备份恢复到测试系统 - 所有命令都以下面的方式调用,但有些命令根本不想工作。 #!/usr/bin/p
在 Python 中,如何使用 shlex.split() 或类似的方法来拆分字符串,只保留双引号?例如,如果输入是 "hello, world"is what 'i say' 那么输出将是 ["he
如何反转 shlex.split 的结果?也就是说,我怎样才能获得一个带引号的字符串 "resemble that of a Unix shell" ,给定一个我希望引用的字符串的 list? 更新0
如何在使用 shlex.split() 时保留“带空格的值”周围的引号? s = "SOME_VAR=\"value with spaces\" VAR2=value2" shlex.split(s)
是否有 Java 的 shlex 替代品?我希望能够像 shell 处理它们一样拆分引号分隔的字符串。例如,如果我发送: one two "three four"并执行拆分,我想收到 token on
我想看看 shlex对于我正在尝试构建的东西来说是一个不错的选择,所以我想我会把它放在 debug mode 中玩弄它。只有 shlex 的构造函数有这个 weird thing it does :
根据文档,在 Python 2.7.3 中,shlex 应该支持 UNICODE。但是,当运行下面的代码时,我得到:UnicodeEncodeError: 'ascii' codec can't en
Python 的标准库有一个 shlex.quote函数接受一个字符串并返回一个保证被 Unix shell 解释为相同字符串的函数。这是通过将字符串放在单引号中并转义出现在其中的任何单引号字符来实现
我想拆分ascii文本 1 'K\^o, Suk\'e' 打印为 Python 字符串 line = "1 'K\\^o, Suk\\'e'\n" 进入 ['1', 'K\\^o, Suk\\'e']
我将如何在 Node.js 中执行以下操作?我意识到可能没有内置功能或为此编写的模块,那么我该如何实现呢? >>> import shlex >>> shlex.split("-a arga -b \
我需要在 elisp 中解析命令行,例如: (shlex-split "command \"Some file with spaces\" someother\ quote") ;;That give
我是一名优秀的程序员,十分优秀!