这里我有两个python包,它们具有完全相同的层次结构和文件夹名称(实际上它们只是不同版本的相同包)
version1\
lib\
__init__.py
overall.py
modules\
module.py
version2\
lib\
__init__.py
overall.py
modules\
module.py
我想要的是创建一个函数,并使用参数调用此函数来指定版本并导入相应的lib,如下所示
def do_something(version):
if version == 1:
sys.path.append('./version1')
elif version == 2:
sys.path.append('./version2')
import lib
#do the reset things with the lib
但是这个函数在多个线程中不起作用,因为sys.path
由一个进程中的所有线程共享。如果sys.path.append
之后和import lib
之前,另一个线程被切入,当前线程最终会导入错误的lib。
我提出了两种解决方案,但它们都不起作用。
解决方案1:
访问sys.path
时添加线程锁定,并在sys.path.remove
之后调用import lib
。但是这不起作用,因为函数或方法可以动态导入相同包中的其他模块。因此,如果您在sys.path.remove
之后调用lib的函数,则会引发错误can not find module
。
当然你可以说锁定整个do_something
函数,只在函数返回之前释放锁。是的,它可以工作,但我的程序将成为一个单线程程序。实际上它是do_something
这是我的线程函数。
解决方案2:
在version1
和version2
中添加空的 init .py,这样我的文件夹就会像这样
version1\
__init__.py
lib\
__init__.py
overall.py
modules\
module.py
version2\
__init__.py
lib\
__init__.py
overall.py
modules\
module.py
这样的代码:
def do_something(version):
if version == 1:
import version1.lib
elif version == 2:
import version2.lib
sys.path.append('./version2')
#do the reset things with the lib
不幸的是,它也不起作用。因为在lib\overall.py
中,它会像import lib.modules.module
一样导入模块。它失败了,无法找到模块。
那么,我怎么能在多线程中做到这一点?无论如何要维护一个私有sys.path的线程来导入模块吗?