如何在Python中解决模块名称冲突?

时间:2015-02-18 17:59:03

标签: python name-collision

我有一个名为websocket的模块。对于这个模块,我想要一些测试,对于这些测试我pip install适当的模块。问题是已安装的模块与我自己的模块具有完全相同的名称。

项目结构

websocket-server
       |
       |---- websocket.py
       |
       '---- tests
               |
               '---- test.py

test.py

from websocket import WebSocketsServer  # my module
from websocket import create_connection # installed module

有没有办法解决这个问题:

  • 无需重命名我的模块(websocket.py
  • 不用丑陋的__init__()
  • 污染我的项目
  • 需要在Python3和2
  • 上工作

5 个答案:

答案 0 :(得分:3)

您可以将模块嵌套在包中吗?

from mywebsocket.websocket import WebSocketsServer # my module
from websocket import create_connection # installed module

请参阅https://docs.python.org/2/tutorial/modules.html#packages

答案 1 :(得分:0)

有一个 imp 模块 - 虽然它已经在Python 3.4中被弃用了。它允许您动态导入模块

my_websource = imp.load_source('my_websource', <path to your module.py>')

答案 2 :(得分:0)

我最终解决了这个问题。解决方案是hackish但它并不重要,因为它只适用于一种特定类型的测试。

import websocket as wsclient # importing the installed module

del sys.modules["websocket"]
sys.path.insert(0, '../..')
import websocket             # importing my own module

所以我现在可以将我自己的模块称为websocket,将已安装的模块称为wsclient

答案 3 :(得分:0)

您可以选择不同的大小写,例如webSocket,因为Python分辨率区分大小写。

答案 4 :(得分:0)

我已经解决了类似脏问题的问题,只能在UNIX / Linux中使用。

在根文件夹中,为自己建立一个软链接:

> ln -s . myroot

然后只需使用简单的前缀导入您想要的任何内容:

import myroot.websocket