在A.py中,我使用os.system(" B.py%s"%searchPath)来调用B.py. B.py将执行一些逻辑操作并获取一些数据。
如何让B.py将这些数据返回给A.py,我应该怎么做B.py?
答案 0 :(得分:0)
方法太多了:
更新
队列示例:查看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,你可以考虑以下几点:
使用stdout
和JSON。我使用这种技术来集成用不同语言编写的应用程序。 B.py
将执行所有计算,将其存储在dict
或list
结构中,并在完成后调用json.dumps
。这样做的好处是您还可以通过返回结构来执行错误/警告处理,例如{"status": "OK", "warning": "Could not find XYZ... skipped"}
使用中间阶段。当B.py
返回大量数据时,这是首选。介质可以是临时文件或数据库。你也可以把两者结合起来!并使B.py
在文件(sqlite3
)
如果您返回的数据很少,您可以考虑仅使用退出状态来表示成功或失败......
希望有所帮助
答案 2 :(得分:0)
我认为你在看subprocesses。您的问题的解决方案看起来像
import subprocess
proc = subprocess.Popen(["B.py", searchpath], stdout=subprocess.PIPE)
(out, err) = proc.communicate()
print "program output:", out
答案 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]