使用子进程python时无法访问文件内容

使用子进程python时无法访问文件内容,python,csv,Python,Csv,脚本A.py(python 3.0)执行一些工作并创建一个output.csv文件。 脚本B.py(python 2.5)将output.csv作为输入并执行一些工作 示例A.py: Outfile = open (path_to_csv, "w+") Outfile.write(string_to_be_written) Outfile.close subprocess.call(["path/to/B.py", path_to_csv, args+]) 示例B.py: csv_file =

脚本A.py(python 3.0)执行一些工作并创建一个output.csv文件。 脚本B.py(python 2.5)将output.csv作为输入并执行一些工作

示例A.py:

Outfile = open (path_to_csv, "w+")
Outfile.write(string_to_be_written)
Outfile.close
subprocess.call(["path/to/B.py", path_to_csv, args+])
示例B.py:

csv_file = open(path_to_csv, "rb")
csv_reader = csv.reader(csv_file)
for row in csv_reader:
    print row
现在,当我直接运行B.py时,它可以完美地工作并打印csv的每一行。 但是当使用subprocess.call从A.py调用时,不读取任何内容。它在阅读时也不会抛出任何错误


我尝试过使用os.system和subprocess.Popen,但它们遇到了相同的问题。我在这里遗漏了什么?

Outfile.write=open(路径到csv,“w+”)
可能是一个输入错误,下一行可以按原样工作。您的意思可能是
Outfile=open(路径到csv,“w+”)

那么问题是您实际上没有关闭文件:

Outfile.close
一事无成。你需要:

Outfile = open (path_to_csv, "w+")
Outfile.write(string_to_be_written)
Outfile.close()
否则,文件将保持打开/未刷新状态。在Windows上,无法再次打开(锁定),在Linux上,它可能包含未刷新的数据

最烦人的事情是,当
a
完成时,文件被正确关闭,并且您看到正确的csv输出,因此它会误导您为什么它不工作

更好:在退出块时,使用带有块的
关闭文件

with open (path_to_csv, "w+") as Outfile:
   Outfile.write(string_to_be_written)
# now call the subprocess outside the with block: the file is closed
subprocess.call(["path/to/B.py", path_to_csv, args+])

更好的方法是:重写两个脚本,使第一个脚本的输出被第二个脚本的输入消耗(避免编写临时文件只是为了传递数据)

您到csv的路径是相对的还是绝对的?示例a的第一行有问题:
Outfile.write=open(path_to_csv,“w+”)
您确定通过a启动时B会运行吗?A是否正确创建了文件/没有崩溃?发布一个可运行的示例应该很容易,我们可以提交它。像
Outfile.write=open(路径“到”csv,“w+”)
这样的错误只会让事情变得混乱!谢谢你在这里指出这个错误,但是我在实际代码中没有犯这个错误。啊,Python的解决方案总是很简单的,不是吗?正如您正确指出的,我没有犯Outfile.write错误(打字错误),但在Outfile.close上犯了错误。令人惊讶的是python没有引发异常并让它运行。在你来救我之前,我几乎已经放弃了它为什么不起作用。谢谢你的解决方案。它起作用了!在windows上会出现异常,因为存在写入文件锁,阻止其他进程(或同一进程)读取正在写入的非关闭文件。在Linux中,没有这样的锁,所以我认为缓冲使得文件在进程结束之前根本不会写入磁盘。很高兴它对你有用。@Shaardyy,为什么会是个例外?功能对象有一个值;如果您引用一个函数而不调用它,那么您就是在查找该值——它是完全有效的语法,并且具有有用的意义(尽管在这种情况下没有那么有用,比如在这里,查找值被立即丢弃,并且查找本身没有副作用)。