在进程之间传递变量的简单方法?
Simply way to pass variables between processes?
有一个问题我一直在寻找解决,但找不到。
如何在不使用 Queue
或 Pipe
的情况下在 python 进程之间传递变量?
import multiprocessing
string = "hi"
def my_process():
global string
string = "success!" # but its only localy...
multiprocessing.Process(target=my_process).start()
我正在寻找一种方法来更改来自不同脚本或进程的变量...
最后,
我为 Python 创建了一个包来解决这个问题。
从 PIP 安装 Guli。
$ pip install guli
Guli 不需要安装任何额外的 PIP 包。
有了这个包就可以了
Guli 可用于在不同的Python 脚本之间、在多个进程之间或在同一个脚本之间传递。
在主进程和另一个(多进程)进程之间传递变量。
- 在不同 Python 脚本之间传递变量。
- 在 'Main Process' 和另一个(多进程)进程之间传递变量。
- 在同一脚本中使用变量。
- 创建/删除/编辑 - GuliVariables。
例子
import guli
import multiprocessing
string = guli.GuliVariable("hello").get()
print(string) # returns empty string ""
def my_function():
''' change the value from another process '''
guli.GuliVariable("hello").setValue(4)
multiprocessing.Process(target=my_function).start()
import time
time.sleep(0.01) # delay after process to catch the update
string = guli.GuliVariable("hello").get()
print(string) # returns "success!!!"
希望我解决了很多人的问题!
Guli 即使在它自己的例子上也不起作用
runfile('Z:/Trading/dm_python_bot_mt/discord_bot_main.py', wdir='Z:/Trading/dm_python_bot_mt')
回溯(最近调用最后):
文件“”,第 1 行,位于
文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\spawn.py”,第 116 行,在 spawn_main
退出代码 = _main(fd, parent_sentinel)
_main 中的文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\spawn.py”,第 125 行
准备(preparation_data)
准备中的文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\spawn.py”,第 236 行
_fixup_main_from_path(数据['init_main_from_path'])
文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\spawn.py”,第 287 行,在 _fixup_main_from_path 中
main_content = runpy.run_path(main_path,
文件“H:\anaconda3\envs\plaid-ml\lib\runpy.py”,第 265 行,在 run_path 中
return _run_module_code(代码, init_globals, run_name,
文件“H:\anaconda3\envs\plaid-ml\lib\runpy.py”,第 97 行,在 _run_module_code
_run_code(代码, mod_globals, init_globals,
文件“H:\anaconda3\envs\plaid-ml\lib\runpy.py”,第 87 行,在 _run_code
执行(代码,run_globals)
文件“Z:\Trading\dm_python_bot_mt\discord_bot_main.py”,第 11 行,位于
multiprocessing.Process(目标=my_function).start()
文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\process.py”,第 121 行,开始
self._popen = self._Popen(自我)
_Popen 中的文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\context.py”,第 224 行
return _default_context.get_context().Process._Popen(process_obj)
_Popen 中的文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\context.py”,第 327 行
return打开(process_obj)
init 中的文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\popen_spawn_win32.py”,第 45 行
prep_data = spawn.get_preparation_data(process_obj._name)
文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\spawn.py”,第 154 行,在 get_preparation_data 中
_check_not_importing_main()
_check_not_importing_main 中的文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\spawn.py”,第 134 行
引发 RuntimeError('''
运行时错误:
已尝试在
当前进程已完成其引导阶段。
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.
有一个问题我一直在寻找解决,但找不到。
如何在不使用 Queue
或 Pipe
的情况下在 python 进程之间传递变量?
import multiprocessing
string = "hi"
def my_process():
global string
string = "success!" # but its only localy...
multiprocessing.Process(target=my_process).start()
我正在寻找一种方法来更改来自不同脚本或进程的变量...
最后,
我为 Python 创建了一个包来解决这个问题。
从 PIP 安装 Guli。
$ pip install guli
Guli 不需要安装任何额外的 PIP 包。
有了这个包就可以了
Guli 可用于在不同的Python 脚本之间、在多个进程之间或在同一个脚本之间传递。 在主进程和另一个(多进程)进程之间传递变量。
- 在不同 Python 脚本之间传递变量。
- 在 'Main Process' 和另一个(多进程)进程之间传递变量。
- 在同一脚本中使用变量。
- 创建/删除/编辑 - GuliVariables。
例子
import guli
import multiprocessing
string = guli.GuliVariable("hello").get()
print(string) # returns empty string ""
def my_function():
''' change the value from another process '''
guli.GuliVariable("hello").setValue(4)
multiprocessing.Process(target=my_function).start()
import time
time.sleep(0.01) # delay after process to catch the update
string = guli.GuliVariable("hello").get()
print(string) # returns "success!!!"
希望我解决了很多人的问题!
Guli 即使在它自己的例子上也不起作用
runfile('Z:/Trading/dm_python_bot_mt/discord_bot_main.py', wdir='Z:/Trading/dm_python_bot_mt')
回溯(最近调用最后): 文件“”,第 1 行,位于 文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\spawn.py”,第 116 行,在 spawn_main 退出代码 = _main(fd, parent_sentinel) _main 中的文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\spawn.py”,第 125 行 准备(preparation_data) 准备中的文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\spawn.py”,第 236 行 _fixup_main_from_path(数据['init_main_from_path']) 文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\spawn.py”,第 287 行,在 _fixup_main_from_path 中 main_content = runpy.run_path(main_path, 文件“H:\anaconda3\envs\plaid-ml\lib\runpy.py”,第 265 行,在 run_path 中 return _run_module_code(代码, init_globals, run_name, 文件“H:\anaconda3\envs\plaid-ml\lib\runpy.py”,第 97 行,在 _run_module_code _run_code(代码, mod_globals, init_globals, 文件“H:\anaconda3\envs\plaid-ml\lib\runpy.py”,第 87 行,在 _run_code 执行(代码,run_globals) 文件“Z:\Trading\dm_python_bot_mt\discord_bot_main.py”,第 11 行,位于 multiprocessing.Process(目标=my_function).start() 文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\process.py”,第 121 行,开始 self._popen = self._Popen(自我) _Popen 中的文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\context.py”,第 224 行 return _default_context.get_context().Process._Popen(process_obj) _Popen 中的文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\context.py”,第 327 行 return打开(process_obj) init 中的文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\popen_spawn_win32.py”,第 45 行 prep_data = spawn.get_preparation_data(process_obj._name) 文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\spawn.py”,第 154 行,在 get_preparation_data 中 _check_not_importing_main() _check_not_importing_main 中的文件“H:\anaconda3\envs\plaid-ml\lib\multiprocessing\spawn.py”,第 134 行 引发 RuntimeError(''' 运行时错误: 已尝试在 当前进程已完成其引导阶段。
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.