我发送字符串Router_Status [Router] =' ON'由父代码到新进程
proc[Router] = subprocess.Popen([sys.executable, os.getcwd() + '/'
+ Router + '.py', Router,
json.dumps(graph),
json.dumps(As_numbers_dict)],
shell=False, stderr=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
proc[Router].stdin.write(bytes(Router_Status[Router],
encoding='utf-8') + b'\n')
并且子进程是
Router_Status[Router]=sys.stdin.readline().strip()
path = os.path.expanduser('~' + '/BGP_Routers/' + Router)
with open(path + '/Router_Status.txt', 'w') as f:
f.write(Router_Status[Router])
但它不起作用! 然后我传递第二个字符串Router_Status [Router] =' OFF'通过这个过程 proc [Router] .stdin.write(bytes(Router_Status [Router],encoding =' utf-8')
proc[Router].stdin.flush()
它仍然没有做任何事情!
答案 0 :(得分:0)
好的,所以我不完全熟悉你传递给subprocess.Popen()的参数,所以我无法检查它们是否正确。但是我对子进程模块知道了一两件事,并且有一些事情要考虑查看你的代码:
shell=False
不需要明确定义,因为它是标准设置(但是,如果你想明白某个原因,那当然没关系)。 stderr=False
不正确。它必须是None
或类似subprocess.PIPE
。然后,由于您使用的是Python3.x,因此文档声明:
警告 - 使用communic()而不是.stdin.write,.stdout.read或 .stderr.read以避免由于任何其他OS管道导致的死锁 缓冲填充和阻止子进程。
所以你最好使用proc[Router].communicate(input="your standard input, meaning your stdin")
它还声明:
Popen.stdin - 如果stdin参数是PIPE,则此属性为 open()返回的可写流对象。如果编码或 指定了错误参数或者是universal_newlines参数 是的,流是文本流,否则它是字节流。如果 stdin参数不是PIPE,此属性为None。
在你的情况下,平均值stdin应该是一个字节流。
总之,我猜你应该做点什么:
proc[Router] = subprocess.Popen([sys.executable, os.getcwd() + '/'
+ Router + '.py', Router,
json.dumps(graph),
json.dumps(As_numbers_dict)],
stderr=subprocess.PIPE,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
proc[Router].stdin.communicate(str(Router_Status[Router]).encode())
我仍然想知道,为什么你包括:
path = os.path.expanduser('~' + '/BGP_Routers/' + Router)
with open(path + '/Router_Status.txt', 'w') as f:
f.write(Router_Status[Router])
因为它与subprocess.Popen()语句基本无关。它只是将用户输入写入文本文件,该文件只捕获最新的输入btw。如果您要将所有用户输入更改'w'
保存到'a'
(这会将文件置于附加模式而不是写入模式)。