-1

我有一个 python 脚本,它按顺序执行两件事:

  1. 生成一堆文件,然后
  2. 移动文件。

我通过遍历文件夹中的所有文件来移动文件:

for filename in os.listdir("."):
    if filename.endswith(".rmp"):

其中 .rmp 文件正是第一个子进程生成的文件。
因此,现在运行一次只会获取文件夹中的 .rmp 文件,而第二步无论出于何种原因都看不到它们,但它会在第二次运行时按预期正确移动它们。
那么如何让它在第一次尝试中识别所有文件。为什么它们首先不可见?

这是代码

var = os.getcwd()
pipe = subprocess.Popen(["perl", "./runtest.pl", var])


for filename in os.listdir("."):
    if filename.endswith(".rmp"):
        print "woopee"
4

3 回答 3

2

我认为您没有关闭文件。这可能会延迟写入并导致os.listdir无法获取所有文件。

确保您始终关闭文件的一种好方法是:

with open('filename.rmp', 'w') as f:
  f.write(...)

这很好,因为它适用于异常,因此您确定不会忘记打开它们。

一旦一切都关闭,他们应该出现在os.listdir(.)

于 2013-09-23T16:12:03.807 回答
2

当您创建子流程时,它会与您当前的流程并行执行。由于您的进程在您的 perl 脚本运行时继续运行,因此您的程序读取目录和 perl 进程写入其文件之间的竞争(这是您的竞争条件)。

要解决它,您应该添加一个调用.wait()

var = os.getcwd()
p = subprocess.Popen(["perl", "./runtest.pl", var])
p.wait() # wait for perl to exit

for filename in os.listdir("."):
    if filename.endswith(".rmp"):
        print "woopee"

我还要补充一点,这将是使用该glob模块的好机会:

from glob import glob
var = os.getcwd()
p = subprocess.Popen(["perl", "./runtest.pl", var])
p.wait()

for filename in glob('*.rpm'):
    print "woopee"
于 2013-09-23T16:52:20.190 回答
0

看起来您不需要与子进程进行任何通信,您只需要运行一个子进程并等待退出。subprocess.call()更方便:

var = os.getcwd()
retcode = subprocess.call(["perl", "./runtest.pl", var])
if retcode != 0:
    # do some error handling, the subprocess returned nonzero exit code

# process the file generated by subprocess
于 2013-09-23T17:14:01.457 回答