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

标签 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 参数可能会帮助我...问题是我一直在使用 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 脚本中。但是,如果有一种方法可以在不诉诸于此的情况下完成这项工作,我很想知道。

提前致谢!

最佳答案

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

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

你可以通过不运行 foo 来解决这个问题,而是运行一些类似的东西:

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

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

关于python - 克服 Python 2.3 中的 os.system() 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3258229/

相关文章:

python - 为什么 Twine 1.9.1 仍在上传到旧版 PyPi?

python - 使用距离过滤数据帧

python - 子进程 check_output OSError : [Errno 2] No such file or directory

c# - 在 C# 中嵌套别名

shell - 在别名中使用其他命令

python - 用 Pandas 附加到数据框单元格?

python - 比较不同数据类型的问题

python - 如何使用 "subprocess"运行复杂的批处理命令

Python,将Popen的流重定向到python函数

sql - 丢失了我的列标题 SQL