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

时间:2010-07-15 17:30:50

标签: python subprocess alias csh os.system

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

因此,如果foo是别名命令:

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

foo <argument>

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

os.system("foo <argument>")

我认为在执行python脚本时必然会发生某种上下文切换,这会导致Python无法访问shell中创建的别名。阅读完文档后,os.system似乎已弃用subprocess,而subprocess有一个shell参数,可能会帮助我解决问题。 .problem是因为我使用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脚本中。但如果有办法让这项工作不依赖于此,我很乐意了解它。

提前致谢!

2 个答案:

答案 0 :(得分:8)

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

BTW:请注意,您在os.system中对shell环境所做的操作不会影响对os.system的后续调用,因为每个调用都在不同的子shell中运行。换句话说,对环境的改变就会丢失。你对别名的调用失败了,因为/ bin / sh使用不同于别名的语法而不是csh。

你可以通过不运行foo来解决这个问题,但有些事情就是这样:

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

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

答案 1 :(得分:0)

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

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

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

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