在Python的不同线程中的不同路径中导入具有相同名称的模块?

时间:2015-03-19 09:19:16

标签: python multithreading import python-import

这里我有两个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:

version1version2中添加空的 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的线程来导入模块吗?

0 个答案:

没有答案