2014-06-20 202 views
2

我有一个以我正在使用的产品命名的模块,而某些第三方为我们产品的API使用相同的模块名称构建了一个包。在试图使用后者时,模块名称会相互冲突。如果我更改API包的名称,我不会轻易做出更改并向上游返回。改变我们的模块名称将是一团糟。Python模块名称冲突

这听起来像是一个疯狂的问题。现在我们通过向API模块添加一个“父”模块来解决它。有没有更好的解决方案?

+2

使用'import xx as yy'?但通过查看你的代表,我会说你已经试过了。 –

+1

你能给我们一个使用场景,比如文件结构吗?如果你有自己的应用程序,可以导入产品模块和产品包,你可以使用相对导入来区分这两者。 – OozeMeister

+0

它们在不同的目录中,都在python路径中。 'import xx as yy'将不起作用,因为python路径中首先出现的路径是将要导入的路径。 @OozeMeister目录结构是:$ ROOT/product和$ ROOT/3rdparty/product,其中$ ROOT和$ ROOT/3rdparty都在python路径中。 – marcog

回答

1

你应该换你自己的模块在一个封装中这样说:

  1. 创建一个目录(如mypylib
  2. 放在目录命名为__init__.py一个空文件
  3. 把你的模块实现文件(如mymod.py)在DIR
  4. 假设有一个名为submod实现子模块mymod.py

当你想使用submod,你应该这样做:

sys.path.insert(0, os.path.join(os.path.dirname(__file__), "mypylib")) 
from mypylib.mymod import submod 

我想大多数第三方模块应用类似的规则,以避免命名冲突,你应该做这样了。

在您当前的情况下,您可以简单地将__init__.py和您的模块放在包目录中,然后在所有源文件上进行字符串替换以应用模块的新布置。

我希望这会有所帮助。

+0

嗯,这可能工作。让我思考这个,回到哟。 – marcog