Python system()在哪个linux shell下执行命令?

Python system()在哪个linux shell下执行命令?,python,linux,shell,Python,Linux,Shell,我正在使用/bin/tcsh作为默认shell 但是,tcsh样式的命令os.system('setenv VAR')对我不起作用。但是os.system('export VAR=val') 因此,我的问题是如何知道os.system()在哪个shell下运行命令?现在,您应该使用模块而不是os.system()。根据那里的文档,默认shell是/bin/sh。我相信os.system()的工作原理是一样的 编辑:我还应该提到,子流程模块允许您通过env参数设置可供执行流程使用的环境。os.sy

我正在使用
/bin/tcsh
作为默认shell

但是,tcsh样式的命令
os.system('setenv VAR')
对我不起作用。但是
os.system('export VAR=val')


因此,我的问题是如何知道
os.system()
在哪个shell下运行命令?

现在,您应该使用模块而不是
os.system()
。根据那里的文档,默认shell是
/bin/sh
。我相信
os.system()
的工作原理是一样的

编辑:我还应该提到,子流程模块允许您通过
env
参数设置可供执行流程使用的环境。

os.system()
只调用
system()
系统调用(
man3 system
)。在大多数*nixes上,这意味着您将获得
/bin/sh


请注意,
export VAR=val
在技术上不是标准语法(尽管
bash
理解它,我认为
ksh
也理解它)。它在
/bin/sh
实际上是Bourne shell的系统上不起作用。在这些系统上,您需要导出并设置为单独的命令。(这也适用于
bash

如果您的命令是一个shell文件,并且该文件是可执行的,并且该文件以“#!”开头,则可以选择您的shell

#!/bin/zsh
Do Some Stuff
您可以编写此文件,然后使用
subprocess.Popen(filename,shell=True)
执行它,这样您就可以使用所需的任何shell

另外,请务必阅读有关操作系统和子流程的内容。Popen

当时正在阅读,我看到了可执行的参数;这似乎是可行的:

$ 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
$python
Python 2.7.1+(r271:868321292012年9月27日21:16:52)
[GCC 4.5.2]关于linux2
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入操作系统
>>>打印os.popen(“echo$0”).read()
嘘
>>>导入子流程
>>>print subprocess.call(“echo$0”,shell=True).read()
/垃圾箱/垃圾箱
>>>打印subprocess.Popen(“echo$0”,stdout=subprocess.PIPE,shell=True)
/垃圾箱/垃圾箱
>>>打印subprocess.Popen(“echo$0”,stdout=subprocess.PIPE,shell=True,executable=“/bin/bash”)。stdout.read()
/bin/bash

>>>print subprocess.Popen(“实际上,cat,/bin/sh(几乎总是bourne shell的某种形式)几乎总是当任何与*nix相关的东西都说“shell”时的意思“没有限定。注意,如果您确实需要在特定的非bourne shell下执行某些代码段,您可以在此处传递类似于“/path/to/tcsh-c”的函数”’。我本想指出shell=True是没有必要的,但我突然想到:是shell负责解释shebang并据此采取行动吗?正确。shell解释“神奇”字节“#!”要查看其他shell应该真正使用此文件。我就是那个人。这就是我要找的。感谢您注意到:)是的,当使用tee将stdout从单个命令传输到多个命令时,这是非常正确的,类似于
command out=stdout | tee>(command_1 in=stdin)>(command_2 in=stdin)
。谢谢你发布这个,竖起大拇指~