A.py调用B.py,在B.py完成之后如何让B将列表返回给A.

时间:2016-02-26 07:55:04

标签: python python-2.7

在A.py中,我使用os.system(" B.py%s"%searchPath)来调用B.py. B.py将执行一些逻辑操作并获取一些数据。

如何让B.py将这些数据返回给A.py,我应该怎么做B.py?

4 个答案:

答案 0 :(得分:0)

方法太多了:

  1. 写和读文件;
  2. 使用队列;
  3. 正如hiro主角所说,将B导入A并调用B的功能。
  4. 更新

    队列示例:查看https://docs.python.org/2/library/queue.html?highlight=queue

    如何等待从上面的链接完成排队任务的示例:

    def worker():
        while True:
            item = q.get()
            do_work(item)
            q.task_done()
    
    q = Queue()
    for i in range(num_worker_threads):
         t = Thread(target=worker)
         t.daemon = True
         t.start()
    
    for item in source():
        q.put(item)
    
    q.join()       # block until all tasks are done
    

答案 1 :(得分:0)

如果你不能直接从A调用B,你可以考虑以下几点:

  1. 使用stdout和JSON。我使用这种技术来集成用不同语言编写的应用程序。 B.py将执行所有计算,将其存储在dictlist结构中,并在完成后调用json.dumps。这样做的好处是您还可以通过返回结构来执行错误/警告处理,例如{"status": "OK", "warning": "Could not find XYZ... skipped"}

  2. 使用中间阶段。当B.py返回大量数据时,这是首选。介质可以是临时文件或数据库。你也可以把两者结合起来!并使B.py在文件(sqlite3

  3. 中创建数据库
  4. 如果您返回的数据很少,您可以考虑仅使用退出状态来表示成功或失败......

  5. 希望有所帮助

答案 2 :(得分:0)

我认为你在看subprocesses。您的问题的解决方案看起来像

import subprocess

proc = subprocess.Popen(["B.py", searchpath], stdout=subprocess.PIPE)
(out, err) = proc.communicate()
print "program output:", out

对于类似的问题: Equivalent of Bash Backticks in Python

答案 3 :(得分:0)

我认为这个问题有点普遍。 您可以使用IPC方法在两个进程之间传递数据(或两个不同的两个脚本运行相同):

https://en.wikipedia.org/wiki/Inter-process_communication

通常更基本的是管道stdout-stdin或使用文件。 例如,子进程模块的Popen对象有一个通信方法,可用于获取数据:

https://docs.python.org/2/library/subprocess.html#subprocess.Popen.communicate

output=`dmesg | grep hda`
# becomes
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]