【问题标题】:Is there any way to run three python files sequentially as the output of each file depends on the other有没有办法顺序运行三个python文件,因为每个文件的输出取决于另一个
【发布时间】:2014-10-02 20:06:41
【问题描述】:

我有三个 python 文件file1.pyfile2.pyfile3.py。每个文件都会生成一个.csv 文件,并按顺序将其交给另一个文件。详细说明file1.py会生成file1.csv,这个.csv文件将是file2.py的输入等等。

 import file1
 import file2
 import file3

 file1
 file2
 file3

 IOError: File file2.csv does not exist

问题是当我导入file2.py 时,没有file1.csv 因为它还没有被执行。请让我如何在不读取下一个 python 文件的情况下按顺序调用每一个。

【问题讨论】:

  • 您不必在顶部导入所有内容。您可以导入、运行、导入、运行。
  • @uʍop ǝpısdn 我什至试过了,但是 python 会首先读取所有导入文件,然后运行文件。
  • but the python will first read all the import files and then it will run the files
  • 看起来你需要一些认真的重构;您的脚本在导入时通常不应该做任何事情。
  • 我想我对现在发生的事情有了更好的了解...... file1.py 等......应该定义将 csv 文件作为输入并返回 csv 文件作为输出的函数。导入顶部的所有模块,然后一一调用函数。

标签: python csv file-io subroutine


【解决方案1】:

您的每个脚本都应设置为生成文件的函数或类。一般结构可能是这样的:

# file1.py
def generate_csv(filename):
    # put your file generation code here
    # you could easily use Python's csv module, for example
    return csv_filename

然后在你的主脚本中你可以调用你的每个脚本,像这样:

# main.py
import file1, file2, file3

def main(filename):
    fname_one = file1.generate_csv(filename)
    fname_two = file2.generate_csv(fname_one)
    fname_three = file3_generate_csv(fname_two)

这可以防止您的原始脚本在导入时运行。您的主脚本控制执行顺序,并且可以对返回的第三个文件名执行任何需要执行的操作。

【讨论】:

  • 我收到以下错误 ValueError: No columns to parse from file
  • 您应该能够使用您已有的任何代码,只需在函数内缩进即可。然后返回它创建的文件的路径。
【解决方案2】:

你可以从命令行流水线

python file1.py|python file2.py|python file3.py

这些文件将使用 sys.stdin / sys.stdout 作为它们的 csv 读取器/写入器。

编辑

您可以编写一个控制器脚本来触发它们。 sys.executable 只是用于启动脚本的 python...我正在使用它,以便所有这些都使用相同的 python。

import sys
import subprocess as subp

file1 = subp.Popen([sys.executable, 'file1.py'], stdout=subp.PIPE)
file2 = subp.Popen([sys.executable, 'file2.py'], stdin=file1.stdout, stdout=subp.PIPE)
file3 = subp.Popen([sys.executable, 'file3.py'], stdin=file2.stdout)

# close parent version of pipes
file1.stdout.close()
file2.stdout.close()

# wait for programs to complete
file1.wait()
file2.wait()
file3.wait()

【讨论】:

  • 我使用 Canopy 作为 IDE。我还需要顺序运行一个文件中的所有文件。
  • @tdelaney 我收到 AttributeError: type object 'file' has no attribute 'stdout'
【解决方案3】:

如果您希望在这样的设置中从sys.argv 读取并输出到stdout应该工作:

$ python file3.py $(python file2.py $(python file1.py))

注意:前导 $ 表示这是一个 bash shell 命令。

虽然要小心。在将其传递给第二个脚本等之前,我通常会 $ echo $(python file1.py)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    相关资源
    最近更新 更多