Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,subprocess.check_call()和管道重定向_Python_Shell - Fatal编程技术网

Python,subprocess.check_call()和管道重定向

Python,subprocess.check_call()和管道重定向,python,shell,Python,Shell,为什么在执行此命令时获取文件列表 subprocess.check_call("time ls &>/dev/null", shell=True) 如果我要粘贴 time ls &>/dev/null 进入控制台,我将只获取时间。 操作系统是Linux Ubuntu。在类似debian的系统上,默认shell是dash,而不是bash破折号不支持&>快捷方式。要仅获取子流程返回代码,请尝试: subprocess.check_call("time ls >/

为什么在执行此命令时获取文件列表

subprocess.check_call("time ls &>/dev/null", shell=True)
如果我要粘贴

time ls &>/dev/null
进入控制台,我将只获取时间。
操作系统是Linux Ubuntu。

在类似debian的系统上,默认shell是
dash
,而不是
bash
<代码>破折号不支持
&>
快捷方式。要仅获取子流程返回代码,请尝试:

subprocess.check_call("time ls >/dev/null 2>&1", shell=True)
要获取子流程返回代码和计时信息,但不获取目录列表,请使用:

subprocess.check_call("time ls >/dev/null", shell=True)

当然,减去子进程返回代码,这与您在
dash
命令提示符上看到的行为相同。

Python版本在
sh
下运行,但控制台版本在默认shell中运行,可能是
bash
dash
。(您的
sh
实际上可能是在POSIX兼容模式下运行的另一个shell,但这没有任何区别。)

bash
dash
都有内置的
time
函数,但是
sh
没有,因此您可以得到
/usr/bin/time
,这是一个正常的程序。这造成的最重要的区别是,
时间
内置进程没有作为具有独立stdout和stderr的子进程运行

另外,
sh
bash
dash
都有不同的重定向语法


但是你试图做的一开始似乎是错的,你只是在控制台上运气好,因为两个错误正在抵消

你想摆脱ls的stdout,但保留time的stderr,但这不是你想要的。您试图重定向stdout和stderr:这就是
&
在任何实际支持它的shell上的含义

那么,为什么您仍然得到
时间
标准?要么(a)您的默认shell不支持
&
,要么(b)您使用的是内置的而不是程序,并且您没有重定向shell本身的stderr,或者(c)上述两种情况


如果您真的希望在Python中执行完全相同的操作,以完全相同的方式消除完全相同的bug,那么您可以手动运行默认shell,而不是使用
shell=True
。根据其工作的原因,可能是:

subprocess.check_call([os.environ['SHELL'], '-c', 'time ls &> /dev/null'])
或者这个:

subprocess.check_call('{} -c time ls &> /dev/null'.format(os.environ(SHELL), shell=True)

但真的,你为什么要这么做?如果要重定向stdout而不是stderr,请编写:

subprocess.check_call('time ls > /dev/null', shell=True)
或者,更好的是,你为什么一开始就使用shell呢

subprocess.check_call(['time', 'ls'], stdout=subprocess.devnull)

你试过了吗?为什么你要在这里首先使用
shell=True
?Himal-添加“executable='/bin/bash'”修复了我的问题,谢谢:)ls只是一个例子,我正在计时一个应用程序,在stdout和stderr上都会产生输出负载,有时我想看看stderr,但通常不想。显然,我想看看时机,这就是现在正在发生的事情。基本上,我的命令看起来类似于“time taskset mpirun./app”,我想放弃来自./app的输出(taskset和mpirun都非常安静)。无论如何,感谢您让我意识到时间不在sh,我明天将尝试您的解决方案。在python 3.7中,我必须使用
subprocess.DEVNULL
(大写)