克服 Python 2.3 中的 os.system() 限制

Posted

技术标签:

【中文标题】克服 Python 2.3 中的 os.system() 限制【英文标题】:Overcoming os.system() limitation in Python 2.3 【发布时间】:2011-03-16 13:16:16 【问题描述】:

我在将我公司的一个脚本从 csh 转换为 Python 时遇到问题。 csh 脚本调用了一个别名命令,但是当我通过 os.system() 调用相同的别名命令时,它不起作用。

所以,如果foo 是别名命令:

CSH 脚本(有效,执行 foo):

foo <argument>

Python(这不起作用,错误声称 foo 是未知命令):

os.system("foo <argument>")

我认为当我执行 python 脚本时一定会发生某种上下文切换,这会导致 Python 无法访问在 shell 中创建的别名。阅读文档后,似乎os.system 被弃用,取而代之的是subprocess,并且subprocess 有一个shell 参数可能可以帮助我...问题是我被卡住了使用 Python 2.3,而 subprocess 直到 2.4 版才可用。

我有在 python 中复制别名的想法。因此,例如,假设 foo 被别名为 cp

CSH:

alias foo cp
foo file1 file2

Python:

os.system("alias foo cp")
os.system("foo file1 file2")

没有骰子...这里也有错误:

sh: line 0: alias: foo: not found
sh: line 0: alias: cp: not found
sh: foo: command not found

我最后的努力是将使用 foo 的几行代码放入 Python 将调用的自己的 CSH 脚本中。但是,如果有一种方法可以在不求助于它的情况下完成这项工作,我很想知道。

提前致谢!

【问题讨论】:

【参考方案1】:

是什么让你认为 os.system 会使用 csh?它使用标准的 C 函数系统,在 Unix 系统上只会调用基本的 /bin/sh。这不会是 csh,但很可能是 bash,或者它的一些更简单的版本。

顺便说一句:请注意,您对 os.system 中的 shell 环境所做的操作不会影响对 os.system 的后续调用,因为每个调用都在不同的子 shell 中运行。换句话说,对环境所做的更改会丢失。并且您对别名的调用失败,因为 /bin/sh 使用的别名语法与 csh 不同。

您可以通过运行而不是 foo 来解决此问题,而是运行类似的东西:

os.system("/bin/csh -i -c 'foo arg1 arg2'")

注意选项-i,它应该强制 csh 读取启动脚本。

【讨论】:

“是什么让你认为 os.system 会使用 csh?”无知? :) 我以为它只是将一个字符串传递给命令行。感谢您的回答。这解决了我遇到的问题,但不幸的是,由于每个调用都在其自己的子外壳中运行,我将不得不完全找出不同的解决方案。我的foo 命令的性质是,它会加载一堆其他内容供您的脚本使用,因此如果 os.system 命令完成后这些内容丢失,那么它将无法工作。跨度> 它确实将这些东西传递到命令行。只是没有单一的 type 命令行;)如果它为后续命令加载其他内容,并且您将整个内容转换为 python,也许您应该先将其他内容转换为 python ;)【参考方案2】:

如果您愿意在 Python 中使用“foo”别名,请在调用 os.system 之前自己执行别名:

cmd = "foo file1 file2"
foo_alias = "cp"

cmd = re.sub("^foo ", foo_alias + " ", cmd)
os.system(cmd)

如果 foo 别名更复杂(使用参数替换等),这可能会更困难。

【讨论】:

以上是关于克服 Python 2.3 中的 os.system() 限制的主要内容,如果未能解决你的问题,请参考以下文章

使用 qBittorrent 运行脚本时如何克服 Python 中的 IO 错误 13

subprocess

subprocess

python如何运行及运行程序

Python - 及时克服导入

windows 7上python3.2.3中的argparse似乎没有解析