当前位置: 首页 > 面试题库 >

有什么办法可以将“ stdin”作为参数传递给python中的另一个进程?

纪秋月
2023-03-14
问题内容

我正在尝试创建一个脚本,该脚本在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()

这显然是行不通的,因为sys.stdin对象对于主进程和p1是不同的。所以我已经尝试过解决这个问题,

//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的stdin文件已关闭,我无法读取。在这种结合下,如何将main的stdin文件传递给另一个进程?如果无法传递标准输入,如何在其他进程中使用main的标准输入?

更新: 好的,我需要澄清我的问题,因为人们认为使用多处理并不是真正必要的。考虑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)

下一个最好的方法是使用aThread()代替Process()for get_input()

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()


 类似资料:
  • 问题内容: 我试图衡量几种方法的执行时间。所以我在想做一个方法,而不是多次重复相同的代码。 这是我的代码: 假设我有,如何使用它来衡量执行时间? 问题答案: 方法不是Java中的一流对象,因此不能将它们作为参数传递。您可以将方法调用包装在扩展例如接口的匿名类中:

  • 问题内容: 我有一个使用处理程序发布可运行实例的线程。它工作得很好,但是我很好奇我如何将参数传递给Runnable实例使用?也许我只是不了解此功能的工作原理。 为了避免出现“您为什么需要此问题”的问题,我有一个线程化的动画,必须调出UI线程来告诉它实际绘制的内容。 问题答案: 只需使用接受参数的构造函数实现的类就可以了, 您可以使用参数化构造函数创建Runnable类的实例。

  • 我在石英(Spring启动应用程序)有一个cron工作。我已经为调度器、触发器、cron作业和所有其他bean创建了bean。作业的目的是基于指定的cron表达式运行。但是对于作业的每个新执行,我希望传递一些特定于该作业的数据到作业详细对象。但是目前,当我试图在JobDetailFactory bean中传递这样的数据时,它只被创建一次(第一次),对于作业的所有进一步执行,传递的都是相同的陈旧数据

  • 问题内容: 我尝试了以下失败的尝试: 在函数a中,我可以使用arguments关键字来访问参数数组,而在函数b中,这些参数将丢失。有没有办法像我尝试的那样将参数传递给另一个javascript函数? 问题答案: 用于对in函数具有相同的访问权,如下所示:

  • 问题内容: 我希望能够创建如下功能: 这里的问题是,在方法中将其视为,因此是的单个参数,而我希望每个in 都作为新参数传递。由于也是带有可变参数的方法,因此应该可行。 如果这不可能,是否有类似的方法?在那种情况下,我可以先使用一个新数组,然后将其传递给该方法。 问题答案: 可变参数方法的基本类型 是 。Sun以这种方式添加了varargs,以保持向后兼容性。 所以,你应该只能够预先考虑到和呼叫。

  • 问题内容: 我是ajax和回调函数的新手,如果我弄错了所有概念,请原谅我。 问题: 我可以将 回调 函数作为参数发送给将执行该回调的另一个函数吗? 问题答案: 对。函数引用与任何其他对象引用一样,您可以将它们传递到您的内心。 这是一个更具体的示例: 您还可以传递以下参数: