os.system() 在哪个Linux shell下执行命令?

9 投票
4 回答
36587 浏览
提问于 2025-04-15 11:48

我现在用的是 /bin/tcsh 这个默认的命令行工具。

不过,我发现用 tcsh 风格的命令 os.system('setenv VAR val') 不能正常工作。但是用 os.system('export VAR=val') 就可以。

所以我想知道,os.system() 运行的命令是在哪个命令行工具下执行的?

4 个回答

9

现在你应该使用Subprocess模块,而不是os.system()。根据那里的说明,默认的命令行是/bin/sh。我觉得os.system()的工作方式也是一样的。

补充一下,我还要提到,subprocess模块允许你通过env参数来设置执行过程中可用的环境。

11

我刚刚在看一篇关于 从Python执行BASH 的文章,然后又看了 Python v2.7.3文档中的17.1. subprocess — 子进程管理,我注意到了 executable 这个参数;看起来它是可以用的:

$ python
Python 2.7.1+ (r271:86832, Sep 27 2012, 21:16:52) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> print os.popen("echo $0").read()
sh
>>> import subprocess
>>> print subprocess.call("echo $0", shell=True).read()
/bin/sh
>>> print subprocess.Popen("echo $0", stdout=subprocess.PIPE, shell=True).stdout.read()
/bin/sh
>>> print subprocess.Popen("echo $0", stdout=subprocess.PIPE, shell=True, executable="/bin/bash").stdout.read()
/bin/bash
>>> print subprocess.Popen("cat <(echo TEST)", stdout=subprocess.PIPE, shell=True).stdout.read()
/bin/sh: Syntax error: "(" unexpected
>>> print subprocess.Popen("cat <(echo TEST)", stdout=subprocess.PIPE, shell=True, executable="/bin/bash").stdout.read()
TEST

希望这对某些人有帮助,
干杯!

5

os.system() 这个函数其实就是在调用系统的 system() 命令(可以通过输入 "man 3 system" 来查看详细信息)。在大多数类Unix系统中,这个命令会使用 /bin/sh 这个默认的命令行解释器。

需要注意的是,export VAR=val 这个写法严格来说并不是标准的语法(不过 bash 是能理解的,我想 ksh 也可以)。如果你的系统中 /bin/sh 实际上是 Bourne shell,那么这个写法就不管用了。在这种情况下,你需要把导出和设置分开写成两个命令。(不过在 bash 中这样写也是可以的。)

撰写回答