python - 使用 eval 启动进程

标签 python process eval

   **exe.py**
    def createProcess(f):
        try:
            from multiprocessing import Process
            newProcess = Process(target=f)
            newProcess.start()
            newProcess.join()
        except:
            print "Error creating process"

    def lala():
        print "success creating process"

    print "tying to make a process"
    from multiprocessing import Process
    newProcess = Process(target=lala)
    newProcess.start()

    **main.py**
    if __name__ == '__main__':
        f = open("exe.py", "r")
        b = f.read()
        f.close()
        o = compile(b, "exe.py", "exec")
        eval(o)

我收到以下错误

    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Program Files\Opsware\agent\lcpython15\lib\multiprocessing\forking.p
    ", line 374, in main
        self = load(from_parent)
      File "C:\Program Files\Opsware\agent\lcpython15\lib\pickle.py", line 1378, in
    load
        return Unpickler(file).load()
      File "C:\Program Files\Opsware\agent\lcpython15\lib\pickle.py", line 858, in
    oad
        dispatch[key](self)
      File "C:\Program Files\Opsware\agent\lcpython15\lib\pickle.py", line 1090, in
    load_global
        klass = self.find_class(module, name)
      File "C:\Program Files\Opsware\agent\lcpython15\lib\pickle.py", line 1126, in
    find_class
        klass = getattr(mod, name)
    AttributeError: 'module' object has no attribute 'lala'

稍后编辑

我将 exe.py 更改为

    def lala2():
        f = open("C:\\work\\asdfas", "w")
        f.write("dsdfg\r\n")
        f.close()
        print "success creating process"

    if __name__ == '__main__':
        print "tying to make a process"
        from multiprocessing import Process, freeze_support 
        freeze_support()
        import pickle
        l = pickle.dumps(lala2)
        pickle.loads(l)()
        newProcess = Process(target=pickle.loads(l))
        newProcess.daemon = True
        newProcess.start()
        if newProcess.is_alive() == True:
            print "alive"
        else:
            print "not alive"
        import time
        time.sleep(12)

这应该使它可以导入,并且由于 pickle 测试,它表明我的方法是可以选择的。关于它为什么会这样的任何建议?

最佳答案

您使用的是 Windows。不幸的是,在 Windows 上,不可能使用动态代码对象作为多处理的目标,因为多处理的 Windows 实现必须能够导入主模块(技术原因是因为 Windows 缺乏 native fork() 等效项)。请参阅multiprocessing programming guidelines for Windows有关适用限制的更多详细信息。

解决方案是将代码写入文件,然后导入它来启动服务器。

关于python - 使用 eval 启动进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28265964/

相关文章:

python - 使用列表理解检查 __builtins__ 是否可调用,避免 eval(print) 错误

python - 转换类名中的字符串(从 appengine 数据存储到类)

python - 我可以同时在 iloc 函数中使用索引位置和索引切片吗?

Python 在 "SystemExit: 1"上引发异常 "sys.exit ( 1 )"

c++ - 检查正在运行的进程是 32 位还是 64 位

c# - 如何通过提供正在运行的进程名称来获取窗口句柄?

asp.net - 在 ASP.NET 中将对象数组列表绑定(bind)到 ListView

python - Sphinx 未删除 html 输出中的 doctest 标志

python - 使用 sqlalchemy SELECT UNCOMPRESS(text) FROM

c# - 模拟注册表并运行可执行文件以使用该注册表