gpt4 book ai didi

python - 有没有办法将 'stdin' 作为参数传递给 python 中的另一个进程?

转载 作者:太空狗 更新时间:2023-10-29 16:56:26 25 4
gpt4 key购买 nike

我正在尝试创建一个使用 python 多处理模块的脚本。该脚本(我们称之为 myscript.py)将从另一个带有管道的脚本获取输入。

假设我这样调用脚本;

$ python writer.py | python myscript.py 

这是代码;

// writer.py
import time, sys

def main():
while True:
print "test"
sys.stdout.flush()
time.sleep(1)

main()

//myscript.py
def get_input():
while True:
text = sys.stdin.readline()
print "hello " + text
time.sleep(3)

if __name__ == '__main__':
p1 = Process(target=get_input, args=())
p1.start()

这显然是行不通的,因为主进程和 p1 的 sys.stdin 对象是不同的。所以我试过这个来解决它,

//myscript.py
def get_input(temp):
while True:
text = temp.readline()
print "hello " + text
time.sleep(3)

if __name__ == '__main__':
p1 = Process(target=get_input, args=(sys.stdin,))
p1.start()

但是我遇到了这个错误;

Process Process-1:
Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "in.py", line 12, in get_input
text = temp.readline()
ValueError: I/O operation on closed file

所以,我猜 main 的标准输入文件已关闭,我无法从中读取。在这种情况下,如何将 main 的 stdin 文件传递​​给另一个进程?如果无法传递 stdin,我如何从另一个进程使用 main 的 stdin?

更新:好的,我需要澄清我的问题,因为人们认为使用多处理并不是真正必要的。像这样考虑 myscript.py

//myscript.py
def get_input():
while True:
text = sys.stdin.readline()
print "hello " + text
time.sleep(3)

def do_more_things():
while True:
#// some code here
time.sleep(60*5)

if __name__ == '__main__':
p1 = Process(target=get_input, args=())
p1.start()

do_more_things()

因此,我确实需要与主函数(或其他子进程)并行运行 get_input() 函数。对于冲突,我很抱歉,我的英语不错,我想我在这个问题上不清楚。如果你们能告诉我我是否可以在另一个进程中使用主进程 STDIN 对象,我将不胜感激。

提前致谢。

最佳答案

最简单的方法是交换 get_input()do_more_things(),即在父进程中读取 sys.stdin:

def get_input(stdin):
for line in iter(stdin.readline, ''):
print("hello", line, end='')
stdin.close()

if __name__ == '__main__':
p1 = mp.Process(target=do_more_things)
p1.start()
get_input(sys.stdin)

下一个最好的办法是为 get_input() 使用 Thread() 而不是 Process():

if __name__ == '__main__':
t = Thread(target=get_input, args=(sys.stdin,))
t.start()
do_more_things()

如果以上方法没有帮助,您可以尝试 os.dup():

newstdin = os.fdopen(os.dup(sys.stdin.fileno()))
try:
p = Process(target=get_input, args=(newstdin,))
p.start()
finally:
newstdin.close() # close in the parent
do_more_things()

关于python - 有没有办法将 'stdin' 作为参数传递给 python 中的另一个进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8976962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com