2011-11-28 65 views
3

我有我的Python工作区两个模块这就需要sip.pyd
Module1.pyd需要sip.pyd(实现v 8.0-8.1)
Module2.pyd需要sip.pyd(另一个文件,实现V6.0 )Python:如何处理同名的几个.pyd依赖项?

所以我不能只选择较新的一个,它不工作:我必须让他们两个!

(RuntimeError: the sip module implements API v6.0 but the fbx module requires API v8.1) 

如何以.pyd扩展名(python dll,不可编辑)导入模块,并指定哪个sip.pyd来源?

至于解决方法,我能做到的是:

  1. 一个sip.pyd是我的根站点包的位置。
  2. 如果我必须导入需要其他sip.pyd的模块,我删除根路径形式的sys.path,然后在其他sip.pyd所在的位置附加精确的文件夹路径。
  3. 我可以导入我的模块并恢复以前的sys.path。

回答

1

的sip.pyd假设你没有一段代码需要两个文件立刻。我想提出以下建议:

  • 在2名单独的目录中安装这两个文件(叫他们如sip-6.0sip-8.0),你会放在site-packages/

  • sip_helper.py文件的代码看起来像

sip_helper.py内容:

import sys 
import re 
from os.path import join, dirname 
def install_sip(version='6.0'): 
    assert version in ('6.0', '8.0'), "unsupported version" 
    keep = [] 
    if 'sip' in sys.modules: 
     del sys.modules['sip'] 
    for path in sys.path: 
     if not re.match('.*sip\d\.\d', path): 
      keep.append(path) 
    sys.path[:] = keep # remove other paths 
    sys.path.append(join(dirname(__file__), 'sip-%s' % version)) 
在site_packages
  • 放sip_helper.py(在SIP-6.0和SIP-8.0目录的父目录)
  • 通话sip_helper.install_sip在你的程序的启动
+0

谢谢,它工作得很好! 如果我有,在相同的代码,以SIP之间切换,我可以这样做: 尝试: 进口MODULEX 情况除外: sip_helper.install_sip() 进口MODULEX – gon2024

1

VirtualEnv完成处理这些情况。

virtualenv是一个创建独立Python环境的工具。

使用的virtualenv,您将能够创建2个environements,一个在8.x版本另一个版本6.0

+0

谢谢你的提示! 因为我已经使用了其他解决方案,我发现VirtualEnv非常有趣! 我确定我会在别的地方,某个时候使用它。 – gon2024

0

我不知道这是否作品(如果一个模块的名字必须与其内容相匹配),但是你不能仅仅将它们重命名为sip6.pyd和resp。 sip8.pyd然后做

if need6: 
    import sip6 as sip 
else: 
    import sip8 as sip