3

我在将我公司的一个脚本从 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 中复制别名的想法。因此,例如,sayfoo被别名为cp.

长沙:

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 脚本中。但是,如果有一种方法可以在不诉诸于它的情况下完成这项工作,我很想知道它。

提前致谢!

4

2 回答 2

8

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

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

您可以通过运行 not 来解决此问题foo,但类似以下内容:

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

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

于 2010-07-15T17:41:44.927 回答
0

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

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

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

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

于 2010-07-15T17:37:42.100 回答