我有一个看起来像这样的项目:
.
├── 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.py
和B/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
封装为(伪)模块名称?任何解决方案都欢迎。
多种可能的解决方案:
cd A && python3 setup.py install
。大概这是一个可安装的软件包。现在,您可以像通常期望的那样导入A。PYTHONPATH
。当您在B
中编程但需要从A
中提取信息时,此功能很有用。因此,您可以在A中修改内容,例如调试消息,并且仍然可以运行您的程序。 PYTHONPATH=/path/to/A python -c "import a; print(a)"
$ 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 install
,pip install
还是将库添加到PYTHONPATH
。)