Python pip安装与本地包具有相同命名空间的包

Python pip安装与本地包具有相同命名空间的包,python,Python,我使用的是通过miniconda安装的Python 3.6.5。我的问题是因为我正在pip安装一个与本地包具有相同名称空间的包。pip安装此包后,我无法再从本地包导入。我收到一个ModuleNotFoundError错误。如果可能,名称空间需要保持这种方式 以下是我的目录结构: /root stuff - __init__.py - my_stuff.py app.py init.py __import__('pkg_resources').declare_namesp

我使用的是通过miniconda安装的Python 3.6.5。我的问题是因为我正在pip安装一个与本地包具有相同名称空间的包。pip安装此包后,我无法再从本地包导入。我收到一个
ModuleNotFoundError
错误。如果可能,名称空间需要保持这种方式

以下是我的目录结构:

/root
  stuff
    - __init__.py
    - my_stuff.py
  app.py
init.py

__import__('pkg_resources').declare_namespace(__name__)
app.py

from stuff.my_stuff import my_fun
from some_stuff.more_stuff import more_fun
from stuff.my_stuff import my_fun
# The code above works, but this causes the error
from stuff.my_stuff import my_fun
在我安装具有相同名称空间“stuff”的包之前,这一切都很正常。pip安装包后,import语句
from stuff.my stuff import my stuf
抛出以下错误:
modulenofounderror:没有名为'stuff.my stuff'的模块
。我有点明白为什么。在Python中导入模块时,它将首先查找内置模块,然后查找sys.path、PYTHONPATH等

这是让我很困惑的部分。如果我创建另一个任意本地模块,如
一些东西
,如下所示:

/root
  stuff
    - __init__.py
    - my_stuff.py
  some_stuff
    - __init__.py
    - more_stuff.py
  app.py
如果我接着跑:

app.py

from stuff.my_stuff import my_fun
from some_stuff.more_stuff import more_fun
from stuff.my_stuff import my_fun
# The code above works, but this causes the error
from stuff.my_stuff import my_fun
一切正常。i、 e.如果我在
东西之前导入
一些东西。更多的东西
。我的东西
,一切都正常。但反之亦然。仅导入
内容。my_内容
会导致
ModuleNotFoundError

app.py

from stuff.my_stuff import my_fun
from some_stuff.more_stuff import more_fun
from stuff.my_stuff import my_fun
# The code above works, but this causes the error
from stuff.my_stuff import my_fun
是什么导致了这种行为?如何解决本地引用与安装了pip的包具有相同命名空间的包的问题

编辑:

我继续进行实验,并注意到当我删除所有
\uuuu init\uuuu.py
文件时,一切都按预期进行。我遇到了这样一个问题:从Python 3.3开始,没有
\uuuu init\uuuuu.py
的文件夹可以被视为隐式命名空间包的一部分。不过,我仍然对上述行为感到困惑。

这应该可以回答您的问题

为了方便起见,我仍将原始答案放在这里


无法通过为pip指定参数来更改“导入路径”(安装名称)。但是,您可以在安装后对软件包进行一些更改:

  • 使用
    pip安装-e git+http://some_url#egg=some-name
    这样,即使两个包具有相同的导入路径,它们也将保存在不同的目录下(使用在#egg=之后提供的一些名称)。在此之后,您可以转到包的源目录(通常是
    venv/src/some name
    )并重命名一些文件夹以更改导入路径

  • 分叉存储库,进行更改,然后从该存储库安装包。或者,您可以使用不同的名称在PyPI上发布您的包,并使用该名称安装它

  • 使用
    pip download
    将其中一个包放入项目中,然后根据需要重命名文件夹


这是否回答了您的问题?