【问题标题】:Loop an existing script循环现有脚本
【发布时间】:2019-07-31 13:13:49
【问题描述】:

我正在使用来自第三方的脚本,我无法修改或显示(我们称之为 original.py),它接受一个文件并产生一些计算。最后它会输出一个结果(使用 print 语句)。

由于我有很多文件,我决定制作第二个脚本来获取所有想要的文件并通过 original.py 运行它们

第一次获取要运行的所有文件的列表

第二次通过 original.py 运行每个文件

第三次从每个文件中获取结果

我有第一步和第二步。但是,最终结果仅保存它读取的最后一个文件中的计算。

import sys
import original
import glob
import os

fn=str(sys.argv[1])

for filename in sys.argv[1:]:
   print(filename)

ficheiros = [f for f in glob.glob(fn)]

for ficheiro in ficheiros:
    original.file = bytes(ficheiro,'utf-8')
    original.function() 

总结一下: 知道我无法更改原始脚本(使用 print 语句制作),我如何获得每个循环的结果?有没有比使用 for 循环更好的方法?

第一个脚本可以用 python original.py 调用 它需要在 original.file 行的脚本中手动更改文件。

此脚本在控制台中输出结果,我将其重定向为:python original.py > result.txt

当我尝试运行我的脚本时,它会读取文件夹中所有正确的文件,但只返回最后一个文件的结果。

# (我试图重新表述这个问题,希望它更容易理解)

#

问题是由于````ficheiros = [f for f in glob.glob(fn)]`````中的错误,它只读取一个文件,因此只输出一个结果。

感谢 cmets 中的 time.sleep() 技巧。

已解决:

我把开头的部分改成:

fn=str(sys.argv[1])

ficheiros= []
for filename in sys.argv[1:]:
   ficheiros.append(filename)
   #print(filename)

现在它可以正确读取所有文件并输出所有结果

【问题讨论】:

  • 你调用的函数是打印还是返回值?听起来它正在打印,所以我不确定您所说的覆盖打印值是什么意思?
  • 我知道你不能告诉我们original.py,但你能告诉我们你会如何使用它吗?你会在命令行上做python original.py inputFile.txt 吗?
  • 如果它真的在打印值,而不是返回它,那将是我第一次看到覆盖 sys.stdout (因此很难重定向输出 - 但它应该抢夺打印件!)有用...
  • for ficheiro in ficheiros: original.function() 中您遍历文件,但original.function 没有获得此信息。也许original.function(ficheiro)
  • 运行原始脚本它只是 python original.py。它没有任何论据。它使用的文件需要在脚本中手动更改。它直接在控制台中打印结果,我用 >file.txt 重定向它

标签: python loops import python-import


【解决方案1】:

根据您的操作系统,有不同的方法可以将打印到控制台的内容附加到文件中。

例如在 Linux 上,您可以运行此文件,该文件为每个文件 python yourfile.py >> outputfile.txt 调用 original.py,然后将有效地保存打印到 outputfile.txt 中的所有内容。

Windows 的语法类似。

【讨论】:

  • 是的,问题是它只打印最后一个读取文件的计算。它不会打印所有先前文件的结果。循环输出未正确打印
  • 您可以尝试在循环for fichiero in fichieros 中添加 time.sleep(5) 并在控制台中查看输出。您是否得到文件 1 的结果,然后用文件 2 的结果等覆盖循环的每次迭代?
  • 我明白了。 ficheiros = [f for f in glob.glob(fn)] statement 有问题。它只读取它找到的第一个文件,因此显然它不会打印其余文件。谢谢,现在我找到了问题
  • @bvm 很高兴它成功了。如果任何答案有帮助,请随时接受或投票。
【解决方案2】:

我不太确定您在问什么,但您可以尝试以下方法之一:

通过像这样运行脚本,将所有输出重定向到文件以供以后使用:python secondscript.py > outfilename.txt

或者,这可能对你有用,也可能不适合你,将打印命令重新定义为一个函数,以你想要的方式输出结果,例如:

def print(x):
    with open('outfile.txt','w') as f:
        f.write('example: ' + x)

如果您选择第二个选项,我建议您保存旧的打印功能 (oldprint = print),以便您以后可以恢复并使用常规打印。

【讨论】:

    【解决方案3】:

    我不知道我是否得到了你想要的。您有一个名为original.py 的第一个脚本,它接受一些参数并以print 语句的形式返回内容,您想在脚本中获取这些打印语句来执行操作吗?

    如果是这样,解决方案可能是subprocess 模块: 假设这是original.py

    print("Hi, I'm original.py")
    print("print me!")
    

    这是main.py

    import subprocess
    
    script_path = "original.py"
    print("Executing ", script_path)
    
    process = subprocess.Popen(["python3", script_path], stdout=subprocess.PIPE)
    
    for line in process.stdout:
        print(line.decode("utf8"))
    

    您可以轻松地在 Popen 调用中添加更多参数,例如 ["arg1", "arg2",] 等。

    输出:

    Executing  original.py
    Hi, I'm original.py
    
    print me!
    

    你可以抓住main.py中的行来做你想做的事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2021-11-22
      • 2017-11-13
      相关资源
      最近更新 更多