【问题标题】:How to gather return value from function in another script in python?如何从python中另一个脚本中的函数收集返回值?
【发布时间】:2015-11-09 19:47:26
【问题描述】:
 fw_test.py

 def _testmethod_():
     x = []
     y = 0
     while y !=5:
        x.append(y)
        y +=1
        return x

 t = _testmethod_()

 main_test.py

 import subprocess
 p = subprocess.call(['python', 'main_test.py'])

由于指导方针,我无法将fw_test.py 导入main_test.py。我希望能够将_testmethod_()fw_test.py 返回的值存储在变量inmain_test.py 中。我了解到使用子进程我可以运行fw_test.py, but that is not enough for me.有没有办法解决这个问题?

编辑:fw_test.py 不能导入到main_test.py 的原因是有很多像fw_test.py 这样的测试脚本会根据测试不断变化。 main_test.py 应该是一个通用框架,它具有通过读取fw_test.py(返回值为True/False)的返回值来评估测试通过或失败的基本功能。我认为,如果我在文件顶部导入脚本,它将不再是通用的。我愿意接受其他建议。

为什么投反对票?

【问题讨论】:

  • 你为什么用双下划线命名你的函数?不要那样做,这是为了 Python 内部的魔法方法。
  • 您能否更清楚地了解建议您不要将fw_test 导入main_test 的准则?
  • 可以修改main_test.py吗?例如,main_test.py 可以使用 sys.exit(1) 返回 Falsesys.exit(0)True 返回到 fw_test.py。此外,您可以使用 importlib.import_module() 动态导入模块。
  • 您始终可以使用动态导入,请参阅importlib。这就是我所做的正是你想要完成的事情;测试脚本直到运行时才知道,名称从文件中加载,然后使用 importlib 导入。

标签: python subprocess


【解决方案1】:

您可以使用subprocess.check_output 获取另一个脚本编写的输出

文件“b.py”将其输出写入标准输出

print("hi")
print(1)

文件“a.py”作为子进程执行“b.py”

import subprocess
a = subprocess.check_output(["python", "/tmp/b.py"])
print(a.decode('utf-8'))

注意:check_output返回的值是一个字节数组,需要解码转成字符串

从命令行执行“a.py”

$ python a.py
hi
1

免责声明:这是给定(用于训练)问题的最简单解决方案(不是最好的)。从技术上讲,我将输出打印到标准输出并在父进程中捕获它。在更严重的问题上解决同样的问题应该使用IPC、RPC等机制。

【讨论】:

  • 您正在制造混乱:打印值从函数返回值不同。我不止一次看到一个完整的初学者尝试使用print(x) 而不是return x,并且充其量在None 上得到AttributeError。像你这样的答案只会让问题变得更糟。
  • 我想我可以使用第一个脚本中的退出代码。但是退出代码的范围很小。当然还有其他的 IPC 替代方案。此练习不需要 INMHO 如此详尽的解决方案,因为这纯粹是一个培训练习,而不是生产代码。
  • 问题不在于你使用check_output()(如果你不能导入模块也可以);问题是您的回答中没有免责声明 print(x)return x 是不同的东西(查看问题的标题)
  • 这不是我的意思。 (1) 捕获标准输出已经是 IPC 方法之一(就像任何允许在进程之间传递数据的方法一样) (2) 你不能指望一个不理解 print(x)return x 之间区别的人知道什么是 RPC。至此,我的cmets应该够用了。
  • 这里有一个具体的例子可以说明我的意思:Is it advisable to use print statements in a python function rather than return
【解决方案2】:

如果不能使用import fw_test语句;你可以use importlib.import_module() instead,从fw_test.testmethod()函数中获取返回值:

import importlib

fw_test = importlib.import_module('fw_test')
value = fw_test.testmethod()

【讨论】:

    【解决方案3】:

    最简单的方法可能是将返回值放到一个文件中,然后让你的 main 去拾取它。

    fw_test.py
    
    def _testmethod_():
        x = []
        y = 0
        while y !=5:
           x.append(y)
           y +=1
           return x
    
    t = _testmethod_()
    
    with open("fileToStoreValue.txt", 'w') as f:
        f.write(t)
    
    main_test.py
    
    import subprocess
    p = subprocess.call(['python', 'main_test.py'])
    t = eval(open("fileToStoreValue.txt", 'r').read().strip())
    

    请注意,我在阅读时包含了strip,以防止您拾取任何尾随的新行。

    另外请记住,如果两个 python 文件都在同一个目录中,这将按照所写的方式工作。如果它们的位置不同,则需要在 open 语句中指定 fileToSTtoreValue.txt 的路径。

    【讨论】:

    • 不要向新手推荐eval()。请改用jsonpickle 等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 2020-06-10
    • 1970-01-01
    • 2019-03-29
    • 2021-12-11
    • 1970-01-01
    相关资源
    最近更新 更多