我在将公司的一个脚本从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脚本中。但如果有办法让这项工作不依赖于此,我很乐意了解它。
提前致谢!
答案 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别名更复杂(使用参数替换等),这可能会更加困难。