我正在尝试将os.popen()的结果发送到输出文件。这是我一直在尝试的代码
import subprocess
fob = Popen('dir',stdout='popen_output.txt',shell=true).stdout
输出文件只是空白。但是,命令的结果显示在屏幕上。我也试过像这样使用Popen(根据子进程管理文档):
import subprocess
subprocess.Popen('dir',stdout='popen_output.txt,shell=true)
以及:
ssl_certificate_key
答案 0 :(得分:2)
确定。这样就搞定了。谢谢你的帮助!
fob = open('popen_output.txt','a')
subprocess.Popen('dir',stdout=fob,shell=True)
fob.close()
答案 1 :(得分:1)
将文件对象传递给stdout而不是文件名作为字符串,您也可以使用check_call
代替Popen,它将为非零退出状态引发CalledProcessError
:
with open('popen_output.txt',"w") as f:
subprocess.check_call('dir',stdout=f)
如果您使用的是subprocess.check_call('dir',stdout=f, shell=True)
,则还可以使用{= 1}}使用shell = True重定向:
>
答案 2 :(得分:1)
这似乎更像是你想做的事情。您可以处理然后写入文件。
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
for line in process.stdout:
#processing then write line to file...
file.write(line)
如果您不想处理,那么您可以在subprocess
电话中执行此操作。
subprocess.run('dir > popen_output.txt', shell=true)
答案 3 :(得分:0)
问题是你调用fp.read()两次而不是将单个fp.read()调用的结果保存为res,打印res,并将res写入输出文件。文件句柄是有状态的,所以如果你两次调用read,第一次调用后的当前位置将在文件/流的末尾,因此是空白文件。
试试这个(仅提供相关更改):
fp = os.popen(cmd)
res = fp.read()
print(res)