如何调用以bash脚本编写的外部程序,使得该脚本生成的输出在sys.stdout中可用,以便我可以通过python将输出记录在文件中。
例如。我现在通过以下代码段打电话给他们
if os.name == 'nt':
path = module_dir_run+'/run.bat'
else:
path = module_dir_run+'/run.sh'
if os.path.isfile(path):
if (splitargs.arg):
try:
call([path, splitargs.arg])
except:
pass
else:
try:
call([path])
except:
pass
else:
print "Not found : " + path
当我存储sys.stdout = file(filename, "w")
的值时,它存储python输出的内容,但不存储脚本输出的内容。
注意:我尝试运行的脚本是一个交互式脚本,所以在调用结束后,控件又回到了python,我怎样才能得到终端写的所有内容? 有什么建议吗?
答案 0 :(得分:1)
您可以使用例如:
将此类调用的输出写入变量variable = subprocess.Popen(
['ls', 'mydir/'], # note that the command is split on whitespace
stdout=subprocess.PIPE).communicate()[0]
答案 1 :(得分:1)
我总是使用subprocess.Popen()从Python脚本中运行另一个程序。例如:
import subprocess
print "Starting process..."
process = subprocess.Popen(["echo", "a"], shell=False)
process.wait()
print "Done"
您可以将进程的输出重定向到另一个文件,如下所示:
import subprocess
print "Starting process..."
with open("./out.log", "w") as f:
process = subprocess.Popen(["echo", "a"], shell=False, stdout=f)
process.wait()
print "Done"
也可以通过'stderr'参数重定向stderr。
如果当前脚本中的sys.stdout
被重定向以写入您自己的文件,您可以执行此操作以在子进程中重定向它:
import subprocess
import sys
sys.stdout = open("./out.log", "w")
print "Starting process..."
sys.stdout.flush()
process = subprocess.Popen(["echo", "a"], shell=False, stdout=sys.stdout)
process.wait()
print "Done"
答案 2 :(得分:0)
正如Martijn Pieters已经声明的那样,您必须为stdout
电话提供替代call()
。
基本上有两种方式:
*要么提供已经打开的文件(因为您已经更改了sys.stdout
,这可能会没问题)
*使用stdout=subprocess.PIPE
并自行阅读和处理stdout
。 (不是通过subprocess.call()
,而是通过subprocess.Popen()
返回的对象。)
请注意,更改sys.stdout
不会从操作系统的视图中真正更改进程的标准输出,而是命令程序在非常规文件描述符上输出所有内容。
答案 3 :(得分:0)
这可能有用。特别是因为大多数其他答案都不明白您需要将父shell的stdin重定向到子进程的stdin,因为您调用的程序/脚本是“交互式的”。