在子进程shell中打开的文件

时间:2011-06-02 15:08:04

标签: python subprocess

在执行以下脚本结束时,我收到一些错误:

filename.enc: No such file or directory
140347508795048:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('filename.enc','r')
140347508795048:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400: 

似乎Popen试图在执行结束时关闭文件,尽管它已被删除。

#!/usr/bin/python
import subprocess, os

infile = "filename.enc"
outfile = "filename.dec"
opensslCmd = "openssl enc -a -d -aes-256-cbc -in %s -out %s" % (infile, outfile)   
subprocess.Popen(opensslCmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, close_fds=True)
os.remove(infile)

如何正确关闭文件?

感谢。

3 个答案:

答案 0 :(得分:3)

这听起来像你的子进程执行,但由于它是非阻塞的,你的os.remove(infile)会立即执行,在子进程完成之前删除文件。

您可以使用subprocess.call()代替命令完成。

...或者您可以更改代码以使用wait()

p = subprocess.Popen(opensslCmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, close_fds=True)
p.wait()
os.remove(infile)

答案 1 :(得分:0)

您可以尝试在线程中运行subprocess.Popen,并在子进程调用返回后删除该文件。

请参阅:Python subprocess: callback when cmd exits

答案 2 :(得分:0)

你也可以使用它。

ss=subprocess.Popen(FileName,shell=True)
ss.communicate()