是否有可能在没有线程或写入单独的文件/脚本的subprocess中运行函数

import subprocess def my_function(x): return x + 100 output = subprocess.Popen(my_function, 1) #I would like to pass the function object and its arguments print output #desired output: 101 

我只find使用单独的脚本打开subprocess的文档。 有谁知道如何传递函数对象,甚至是传递函数代码的简单方法吗?

我想你正在寻找更像多处理模块的东西:

http://docs.python.org/library/multiprocessing.html#the-process-class

subprocess模块用于产生进程并用它们的input/输出进行处理 – 而不是用于运行function。

以下是您的代码的multiprocessing版本:

 from multiprocessing import Process, Queue def my_function(q, x): q.put(x + 100) if __name__ == '__main__': queue = Queue() p = Process(target=my_function, args=(queue, 1)) p.start() p.join() # this blocks until the process terminates result = queue.get() print result 

你可以使用标准的Unix fork系统调用,如os.fork()fork()将创build一个新的进程,并运行相同的脚本。 在新进程中,它将返回0,而在旧进程中它将返回新进程的进程ID。

 child_pid = os.fork() if child_pid == 0: print "New proc" else: print "Old proc" 

对于更高级别的库,它提供了多处理支持,为使用多进程提供了一个可移植的抽象,还有多处理模块。 IBM DeveloperWorks上有一篇关于Python的多重处理的文章,并简要介绍了这两种技术。

Brian McKenna上面关于多处理的post是非常有帮助的,但是如果你想要走下线程(与基于进程的路线相反),这个例子会让你开始:

 import threading import time def blocker(): while True: print "Oh, sorry, am I in the way?" time.sleep(1) t = threading.Thread(name='child procs', target=blocker) t.start() # Prove that we passed through the blocking call print "No, that's okay" 

您也可以使用setDaemon(True)function立即为线程背景。