gpt4 book ai didi

python - Windows 中 Python 全局变量的作用域

转载 作者:行者123 更新时间:2023-12-01 04:44:17 26 4
gpt4 key购买 nike

我有一个 CLI 脚本,用于将文件推送到 s3 存储桶中。对于较大的文件,我将文件分成几部分并上传在平行下。 (在这里粘贴代码结构。我试图制作一个简约的示例,但即使这样也有 60 行长)

def _upload_part(argFile, argBucket, max_attempts_limit, **core_chunk):
#bunch of stuff
pool = Pool(processes=parallel_processes)
for i in range( chunk_amount ):
#bunch of stuff
pool.apply_async( _upload_for_multipart, [keyname, offset, mp, part_num, bytes] )
pool.close()
pool.join()

def _upload_for_multipart(keyname, offset, mp, part_num, bytes):
#code to upload each part
#log the status of each part to log files

def _get_logger( pdir, ldir, lname, level, fmt ):
os.makedirs( logs_dir )
logging.basicConfig(
filename=os.path.join(logs_dir, lname),
level=level,
format=fmt
)
return logging.getLogger( lname )

#under main
if __name__ == "__main__":
logneeds = dict( pdir=exec_dir, ldir='logs', lname='s3_cli.log', level='INFO',
fmt='%(asctime)s %(levelname)s: %(message)s' )
logger = _get_logger(**logneeds)

上述代码结构在 OSX 和 Linux 中有效,但在 Windows 中失败。它说_upload_for_multipart函数下name 'logger' is not Defined。全局变量的方式有区别吗在基于 Windows 和 UNIX 的操作系统中被解释吗?

编辑:添加工作示例 here

最佳答案

您所看到的是 Windows 与 UNIX-y 操作系统(或任何支持 fork 的操作系统)上创建子进程的方式有所不同。在 Linux 上,fork 用于创建子进程,这会在父进程的写时复制副本中创建子进程。这意味着父级中存在的所有变量都将存在于子级中。

但是,Windows 不支持fork。为了创建子进程,它会生成一个全新的进程,然后在子进程中重新导入父进程的 __main__ 模块。在您的情况下,这意味着运行您的程序的脚本将被导入到子进程中。 logger 的创建发生在父级的 if __name__ == "__main__": 保护内部,这意味着当子级导入模块时它会被跳过。 multiprocessing 文档中有几个地方提到了这一点,我在 this answer 中明确列出了它们。 .

为了让 logger 存在于子模块中,它需要在模块的顶层创建(这意味着它在每次导入时运行),或者您需要要在所有子进程中显式创建它,可能使用 multiprocessing.Poolinitializer 参数:

logger = None

def init_log():
global logger
logneeds = dict(pdir=exec_dir, ldir='logs', lname='s3_cli.log', level='INFO',
fmt='%(asctime)s %(levelname)s: %(message)s' )
logger = _get_logger(**logneeds)

def _upload_part(argFile, argBucket, max_attempts_limit, **core_chunk):
#bunch of stuff
pool = Pool(processes=parallel_processes, initializer=init_log)
for i in range( chunk_amount ):
#bunch of stuff
pool.apply_async( _upload_for_multipart, [keyname, offset, mp, part_num, bytes] )
pool.close()
pool.join()

def _upload_for_multipart(keyname, offset, mp, part_num, bytes):
#code to upload each part
#log the status of each part to log files

def _get_logger( pdir, ldir, lname, level, fmt ):
os.makedirs( logs_dir )
logging.basicConfig(
filename=os.path.join(logs_dir, lname),
level=level,
format=fmt
)
return logging.getLogger( lname )

#under main
if __name__ == "__main__":
init_log()

关于python - Windows 中 Python 全局变量的作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29835478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com