2017-08-20 26 views
1

最近我一直在試驗discord bots,它使用asyncio。我一直在製作一個程序,控制很多其他的機器人,在飛行中打開和關閉它們,但我有一個問題;我已經嘗試過使用subprocess.Popen,rpyc和multiprocessing,但我正在努力研究如何在程序之間進行通信。我用下面的代碼行啓動子流程的嘗試:一個asyncio程序來管理許多其他

Popen('python smallprogram.py', stdout=PIPE, stdin=PIPE) 

,但我仍然無法從主程序傳達給更小的方案,由於較小的需要來ASYNCIO運行。這阻止了我通過Popen.communicate()使用input()。 理想情況下,我希望有一種方法可以在需要時調用較小程序的函數,而小程序仍然運行asyncio。我不介意將相同的代碼塊粘貼到每個較小的程序中,但我認爲這也可以通過一些導入來解決?

可以這樣做嗎?我從來沒有做過API,但似乎我可能需要使用API​​作爲模板。謝謝:)

注意:我只有需要做大 - >小的溝通,但是反過來也不錯。

+0

爲什麼不是簡單地產生新的asynci o任務而不是使用子進程? – Vincent

+0

@Vincent我不太瞭解我會如何去做這件事。該程序的想法是我可以即時修改機器人,這意味着我可以修改其代碼而無需重新啓動其他代碼,也可以手動注入代碼。這不需要事先預先寫好機器人嗎? –

+0

是的。查看我的答案獲取更多信息。 – Vincent

回答

0

還有many ways來處理進程間通信,我認爲你使用stdin/stdout是一種有效的方法。

事實證明,可以從asyncio中的stdin異步讀取,儘管它僅使用標準庫的quite tricky to do

或者,你可以使用aioconsole幫手ainput

import aioconsole 

async def echo_child(): 
    data = await aioconsole.ainput() 
    print(data, end='') 

或者get_standard_streams爲類似stream API接口:

import aioconsole 

async def echo_child(): 
    stdin, stdout = await aioconsole.get_standard_streams() 
    data = await stdin.readline() 
    stdout.write(data) 

在父方:

import asyncio 

async def parent(): 
    proc = await asyncio.create_subprocess_exec(
     sys.executable, 'child.py', 
     stdin=asyncio.subprocess.PIPE, 
     stdout=asyncio.subprocess.PIPE) 
    proc.stdin.write(b'Hello\n') 
    data = await proc.stdout.readline() 
    print(data.decode().strip()) 
    proc.terminate() 
+0

這看起來很完美,非常感謝! –