python3 只有一个目录被导入到命名空间包中

标签 python python-3.x

我是 python 编程新手,正在尝试学习命名空间包。

我在两个目录path1和path2中有命名空间包split_farm,如下所示-

    $ tree .
    .
    ├── path1
    │   └── split_farm
    │       ├── common.py
    │       ├── cow.py
    │       ├── __init__.py
    │       ├── ox.py
    │       └── __pycache__
    │           └── __init__.cpython-35.pyc
    └── path2
        └── split_farm
            ├── chicken.py
            ├── __init__.py
            ├── __pycache__
            │   └── __init__.cpython-35.pyc
            └── turkey.py

    6 directories, 9 files

然后我将 path1 和 path2 扩展为 sys.path,如下所示 -

    $ python3
    Python 3.5.2 (default, Nov 12 2018, 13:43:14) 
    [GCC 5.4.0 20160609] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys                
    >>> sys.path.extend(['path1', 'path2'])
    >>> import split_farm
    >>> split_farm.__path__
    ['path1/split_farm']
    >>> locals()
    {'sys': <module 'sys' (built-in)>, '__name__': '__main__', '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, 'split_farm': <module 'split_farm' from 'path1/split_farm/__init__.py'>, '__builtins__': <module 'builtins' (built-in)>, '__doc__': None}

如上所示,仅导入了“path1/split_farm”,但未导入“path2/split_farm”。

我的代码在 github 上 here

我该如何解决这个问题?

最佳答案

我认为没有一种简单的方法可以完成您正在做的事情。

基本上,Python 通过在 PYTHONPATH 环境变量中包含的每个目录中按顺序查找模块来导入模块。一旦找到匹配项,它就会停在那里。

在本例中,它在 path1 中找到 split_farm,导入它,然后停在那里。它将把 path2 中的 split_farm 视为完全不同的模块,这将被视为命名空间冲突。

使用一大堆自定义导入逻辑并使用加载的模块可以实现这一点,但我不推荐这样做。

更惯用的方法是让两个包在父包中命名不同的东西,或者将它们组合成一个包。

关于python3 只有一个目录被导入到命名空间包中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56829700/

相关文章:

python - ScrollLabel 产生 ValueError

python - python中的图像偏度和峰度

带有可变参数的 Python "maximum recursion depth exceeded in comparison"。但是,可以很好地处理列表

python - 查看函数是否被调用

python-3.x - 尝试解密消息但收到 TypeError : can't concat bytes to str

Python:Mac 和 Ubuntu 之间的 Unicode 编码不同

python - 在具有非唯一值的列上合并 Python 中的两个数据框

c++ - swig 没有名为 _example 的模块

python - 在 tqdm 中获取后缀字符串

python - tensorflow : result of training data(using sigmoid) came out reversely