Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t从另一个python.py文件运行进程_Python_Django_Python 3.x_Python Multiprocessing_Python Multithreading - Fatal编程技术网

Can';t从另一个python.py文件运行进程

Can';t从另一个python.py文件运行进程,python,django,python-3.x,python-multiprocessing,python-multithreading,Python,Django,Python 3.x,Python Multiprocessing,Python Multithreading,我正在创建一个类,在初始化它时,我正在调用(多进程)它的函数。当我从同一个.py文件创建这个类时,一切正常。但是,当我从另一个.py文件初始化这个类时,它失败并抛出一个错误。。。为什么? MyDummyClass.py: import multiprocessing class MyDummyClass: def __init__(self): print("I am in '__init__()'") if _

我正在创建一个类,在初始化它时,我正在调用(多进程)它的函数。当我从同一个.py文件创建这个类时,一切正常。但是,当我从另一个.py文件初始化这个类时,它失败并抛出一个错误。。。为什么?

MyDummyClass.py:

import multiprocessing
class MyDummyClass:            
    def __init__(self):        

        print("I am in '__init__()'")

        if __name__ == 'MyDummyClass':

            p = multiprocessing.Process(target=self.foo())
            p.start()


    def foo(self):
        print("Hello from foo()")
from MyDummyClass import MyDummyClass 
dummy = MyDummyClass()
example.py:

import multiprocessing
class MyDummyClass:            
    def __init__(self):        

        print("I am in '__init__()'")

        if __name__ == 'MyDummyClass':

            p = multiprocessing.Process(target=self.foo())
            p.start()


    def foo(self):
        print("Hello from foo()")
from MyDummyClass import MyDummyClass 
dummy = MyDummyClass()
当我运行example.py时,出现以下错误:

I am in '__init__()'
Hello from foo()
I am in '__init__()'
Hello from foo()

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Python\lib\multiprocessing\spawn.py", line 105, in spawn_main
    exitcode = _main(fd)
  File "C:\Python\lib\multiprocessing\spawn.py", line 114, in _main
    prepare(preparation_data)
  File "C:\Python\lib\multiprocessing\spawn.py", line 225, in prepare
    _fixup_main_from_path(data['init_main_from_path'])
  File "C:\Python\lib\multiprocessing\spawn.py", line 277, in _fixup_main_from_path
    run_name="__mp_main__")
  File "C:\Python\lib\runpy.py", line 263, in run_path
    pkg_name=pkg_name, script_name=fname)
  File "C:\Python\lib\runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "C:\Python\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "E:\Dropbox\Docs\Business\_NZTrackAlerts\Website\Current dev\NZtracker\cgi-bin\example1.py", line 2, in <module>
    dummy = MyDummyClass()
  File "...path to my file...\MyDummyClass.py", line 13, in __init__
    p.start()
  File "C:\Python\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "C:\Python\lib\multiprocessing\context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Python\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "C:\Python\lib\multiprocessing\popen_spawn_win32.py", line 33, in __init__
    prep_data = spawn.get_preparation_data(process_obj._name)
  File "C:\Python\lib\multiprocessing\spawn.py", line 143, in get_preparation_data
    _check_not_importing_main()
  File "C:\Python\lib\multiprocessing\spawn.py", line 136, in _check_not_importing_main
    is not going to be frozen to produce an executable.''')
RuntimeError: 
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.
我在“\uuuu init\uuuuuuu()”中
你好,来自foo()
我在'初始'
你好,来自foo()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Python\lib\multiprocessing\spawn.py”,第105行,在spawn\u main中
出口代码=_主(fd)
文件“C:\Python\lib\multiprocessing\spawn.py”,第114行,在_main中
准备(准备数据)
文件“C:\Python\lib\multiprocessing\spawn.py”,第225行,在prepare中
_从路径修复主路径(数据['init\u main\u from\u path'])
文件“C:\Python\lib\multiprocessing\spawn.py”,第277行,位于\u fixup\u main\u from\u path中
运行\u name=“\uuuuump\umain”)
文件“C:\Python\lib\runpy.py”,第263行,在运行路径中
pkg_name=pkg_name,script_name=fname)
文件“C:\Python\lib\runpy.py”,第96行,在运行模块代码中
模块名称、模块规格、组件名称、脚本名称)
文件“C:\Python\lib\runpy.py”,第85行,在运行代码中
exec(代码、运行\全局)
文件“E:\Dropbox\Docs\Business\\NZTrackAlerts\Website\Current dev\NZtracker\cgi bin\example1.py”,第2行,在
dummy=MyDummyClass()
文件“…我的文件的路径…\MyDummyClass.py”,第13行,在\uuu init中__
p、 开始()
文件“C:\Python\lib\multiprocessing\process.py”,第105行,在开始处
self.\u popen=self.\u popen(self)
文件“C:\Python\lib\multiprocessing\context.py”,第223行,在\u Popen中
返回_default_context.get_context().Process._Popen(Process_obj)
文件“C:\Python\lib\multiprocessing\context.py”,第322行,在\u Popen中
返回Popen(过程对象)
文件“C:\Python\lib\multiprocessing\popen\u spawn\u win32.py”,第33行,在\uuu init中__
prep_data=spawn.get_preparation_data(进程对象名称)
文件“C:\Python\lib\multiprocessing\spawn.py”,第143行,在get\U准备\U数据中
_选中\u not \u导入\u main()
文件“C:\Python\lib\multiprocessing\spawn.py”,第136行,在\u check\u not\u importing\u main中
不会冻结以生成可执行文件。“”
运行时错误:
已尝试在启动之前启动新进程
当前进程已完成其引导阶段。
这可能意味着您没有使用fork启动您的应用程序
子进程,而您忘记了使用正确的习惯用法
在主模块中:
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
冻结支持()
...
如果程序
不会冻结以生成可执行文件。
我不明白(其他帖子也不明白)如何修复它


非常感谢你的帮助

这与python实际执行脚本的方式有关。它抛出的错误本质上是说,当python还没有准备好时,您正在尝试启动一个新进程。这是因为您在主脚本中调用
dummy=MyDummyClass()
,而没有给python完全初始化的机会。如果改为使用
example.py
,如下所示:

from MyDummyClass import MyDummyClass 
if __name__ == "__main__":
    dummy = MyDummyClass()
这将产生您想要的输出:

C:\Python Scripts>python example.py
I am in '__init__()'
Hello from foo()
if\uuuuu name\uuuuu=“\uuuuu main\uuuu”
块告诉python“仅当脚本作为主脚本运行时(即
python example.py
),这将强制python在运行该块之前正确初始化所有内容


抱歉,如果这个答案没有充分描述python后端在进行初始化时发生的情况,我自己对此一无所知:)

这与python实际执行脚本的方式有关。它抛出的错误本质上是说,当python还没有准备好时,您正试图启动一个新进程但是,这是因为您在主脚本中调用
dummy=MyDummyClass()
,而没有给python一个完全初始化的机会。如果改为使用
example.py
如下所示:

from MyDummyClass import MyDummyClass 
if __name__ == "__main__":
    dummy = MyDummyClass()
这将产生您想要的输出:

C:\Python Scripts>python example.py
I am in '__init__()'
Hello from foo()
if\uuuuu name\uuuuu=“\uuuuu main\uuuu”
块告诉python“仅当脚本作为主脚本运行时(即
python example.py
),这将强制python在运行该块之前正确初始化所有内容


抱歉,如果这个答案没有充分描述python后端在进行初始化时发生的情况,我自己对此一无所知:)

非常感谢@Aether(+1)!它确实奏效了。也就是说,我真正的程序要复杂得多(我在这里放了一个简化的例子)。也就是说,如果我在main中添加[if name==“main”](或“example.py”,如下所示),会发生什么?程序是否一直等到所有东西都被初始化,然后才调用另一个类的初始化?等一下吗?或者发生了什么?非常感谢你!下面是一个实验:尝试将相同的
if name=main
块添加到
MyDummyClass
声明文件中,然后运行
example.py
。您将看到该代码没有运行,因为您没有将python脚本作为主脚本运行!当python导入脚本时,它会在导入时执行该脚本全局范围内的所有代码。将
name main
块放在脚本中告诉python,如果导入它,就不要执行,只有当它是main(并且在初始化之后)时才执行。另外,如果我的答案有效,你介意把它标记为被接受的答案吗:)谢谢@AetherUnboud。当然可以(标记为答案)。是的,我试过了,但没有成功(如预期的那样)。我想问的是初始化会发生什么?主进程是否会“等待”直到所有东西都安全初始化,然后运行其他类及其多进程