import subprocess
with open ("log.txt",'a') as log:
output = subprocess.Popen("ech ;echo hello", shell=True, stdout=log, stderr=subprocess.STDOUT)
print output.wait() # prints 0
ech
将"/bin/sh: ech:命令未找到“写入"log.txt”。但是返回代码是0(成功),因为最后一个命令是成功的。我希望获得单个命令返回代码,而不是最后一个命令的返回代码。
另外,假设命令是依赖的-例如:cd .. ; pwd
-它们不应该作为两个子进程调用被拆分和运行,因为pwd
将不考虑cd ..
的影响。
上面的例子只是为了澄清。请不要推荐使用cwd
解决这个问题。
发布于 2016-11-17 05:39:10
您需要做我一直建议人们做的事情,作为任何Bash脚本的第一行:
set -e (quite standard)
set -o pipefail (requires Bash 3 or later)
然后,每当命令(或管道的一部分)失败时,整个脚本都会失败。这将通过在没有找到ech
时立即停止来解决您的问题。
发布于 2016-11-17 05:34:27
这看上去更像是个无聊的问题。如果您使用错误的命令作为"ech“,然后继续使用子进程以外的其他内容,则不会知道这一点。
您可以轻松地将bash命令连接起来&这将导致0,以防所有命令都得到适当的执行。
Subprocess本身正在创建一个不同的进程,无论您引入了什么,您都会在那里执行,因此,按照建议的做法只会在好的情况下导致0。
发布于 2016-11-17 05:52:13
你不能简单地去做。如果您使用一个命令shell来处理所有命令,那么您将只获得连接的输出和shell本身的返回值,这将是最后执行的命令的返回值。
另一方面,如果您使用每个命令的专用子进程,则必须模拟真实的shell,并特别处理可能更改环境(如cd
、export
或变量分配)的每个命令,以允许将依赖项应用于以下命令
TL/DR:如果你想模仿一个真实的外壳,你必须写一个真实的外壳.
https://stackoverflow.com/questions/40656117
复制