Python安装包名称冲突

问题描述 投票:1回答:1

我有一个看起来像这样的项目:

.
├── A
│   ├── setup.py
│   ├── __init__.py
│   ├── a.py
│   └── data.py
└── B
    ├── b.py
    └── data.py

我无法控制A,但我想在B/b.py中使用它。我无法重写文件夹A中的任何代码(setup.py除外)。

我尝试过:

# File A/setup.py
from setuptools import setup, find_packages
setup(name='packageA', version='1.0', packages=find_packages())

进行以下安装/测试:

$ cd B
$ pip install -e ../A
$ python -c "import a; print(a)"
<module 'a' from 'A/a.py'>
$ python -c "import data; print(data)"
<module 'data' from 'B/data.py'> 
# How to get the same for <module 'data' from 'A/data.py'>?

名称冲突在这里困扰着我,我希望能够将A/data.pyB/data.py都导入到b.py中。我想知道是否有办法解决?

我希望能够写类似:

$ python -c "from A import data; print(data)"
<module 'data' from 'A/data.py'>

我试图在根目录中将setup.py设置为更高的一级,但是如果执行该操作,则A中将出现问题:

$ cd B
$ pip install -e ..
$ python -c "from A import data; print(data)"
Traceback (most recent call last):
  File "A/data.py", line 1, in <module>
    from a import some_function
ImportError: cannot import name 'some_function' from 'a' (unknown location)

如果我可以重写A/data.py,我可以这样做(但我不能):

from A.a import some_function

是否可以修改setup.py以将A封装为(伪)模块名称?任何解决方案都欢迎。

python namespaces package setuptools
1个回答
0
投票

多种可能的解决方案:

  1. 作为软件包安装A。 cd A && python3 setup.py install。大概这是一个可安装的软件包。现在,您可以像通常期望的那样导入A。
  2. 将A添加到PYTHONPATH。当您在B中编程但需要从A中提取信息时,此功能很有用。因此,您可以在A中修改内容,例如调试消息,并且仍然可以运行您的程序。 PYTHONPATH=/path/to/A python -c "import a; print(a)"
  3. 您可以从父文件夹创建启动程序,将它们像普通模块一样导入。确保您是using relative imports

$ cd B
$ pip install -e ../A
$ python -c "import a; print(a)"
<module 'a' from 'A/a.py'>
$ python -c "import data; print(data)"
<module 'data' from 'B/data.py'> 
# How to get the same for <module 'data' from 'A/data.py'>?

名称冲突在这里困扰着我,我希望能够导入b.py中的A / data.py和B / data.py都可以。我想知道是否有一个办法吗?

我希望能够写类似的东西:

$ python -c "from A import data; print(data)"
<module 'data' from 'A/data.py'>

您执行from A import data。然后,您将获得“ A/data.py”。如果发生名称冲突,您也可以执行from a import data as newname。假设您已将A安装为python模块。 (是通过setup.py installpip install还是将库添加到PYTHONPATH。)

© www.soinside.com 2019 - 2024. All rights reserved.