我有一个简单的Python包,用于绘制科学数据,名为pliffy
。代码托管在Github上的this repo。我已经在PyPihere上发表了它
我收到一位同事发来的Github issue封邮件,他试图使用该软件包。基本上,执行pip install pliffy
会安装包,但当启动Python解释器并尝试导入包时,会收到以下错误消息:
ImportError: cannot import name 'figure' from partially initialized module 'pliffy' (most likely due to a circular import) ([...]/testing/pliffy/venv/lib/python3.8/site-packages/pliffy/__init__.py)
在创建了一个新的Python环境并在我的包中安装了pip之后,我已经能够在我自己的机器上重现这个问题(是的,我现在知道在您将自己的包推到Pypi之后测试它们的重要性;我不会再犯这个错误了!)
但是,如果执行以下操作(克隆和本地安装),则不会收到错误消息:
git clone https://github.com/MartinHeroux/pliffy.git
cd pliffy/
python3 -m venv venv
source venv/bin/activate
python setup.py build
python setup.py install
python
>>> import pliffy
>>> pliffy.demo.demo()
当使用类型暗示我自己的类/对象时,我遇到了循环导入的问题,但是我认为我解决了所有问题,因为我能够在本地安装和使用我的包
我确实尝试将plot.py模块中的import语句更改为仅导入pliffy
而不是from pliffy import estimate, figure, parse
,但这并没有解决问题。因为这个问题似乎只有在我创建了pythonwheel并将其推送到PyPi之后才会出现,所以我必须推送一个版本,以确定它不起作用(即,当我在本地安装包时它起作用)
如果它有用,下面是我如何创建控制盘并将包推送到PyPi:
pip install twine
python setup.py sdist bdist_wheel
twine upload --repository-url https://test.pypi.org/legacy/ dist/* # as a test
twine upload dist/*
在此问题上的任何帮助都将不胜感激
更新:其他信息
亲爱的贾斯汀,感谢您抽出时间阅读我的问题并询问更多信息
为了回答您的问题,我创建了一个本地环境,在本地安装了我的包(即pliffy),并在包文件夹中启动了Python解释器而不是。我在尝试导入包时收到一条错误消息,但这次出现了另一个错误:
>>> import pliffy
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<frozen zipimport>", line 259, in load_module
File "/home/martin/Desktop/venv/lib/python3.8/site-packages/pliffy-0.1.2-py3.8.egg/pliffy/__init__.py", line 4, in <module>
ImportError: cannot import name 'figure' from 'pliffy' (/home/martin/Desktop/venv/lib/python3.8/site-packages/pliffy-0.1.2-py3.8.egg/pliffy/__init__.py)
这告诉我,以前我没有收到错误,因为我在包目录中启动Python解释器。我不清楚为什么在启动包文件夹中的Python解释器而不是时会出现错误(以及另一个错误)
达斯汀,你还问了进口结构。我不太确定有多少(很少)信息,但我决定提供所有信息:
pliffy
├── __init__.py
├── demo.py
├── estimate.py
├── parser.py
├── plot.py
├── utils.py
└── figure
├── diff_axis.py
├── figure_ab.py
├── figure_diff.py
├── figure.py
└── __init__.py
init.py [API只需要底部两个导入,但需要其他导入才能使我的测试套件正常工作(这可能不需要,但当我编写此代码时,我无法测试这些其他模块,除非我在此处包含显式导入)。]
from . import estimate
from . import plot
from . import utils
from . import figure
from . import parser
from . import demo
from pliffy.plot import plot_abd
from pliffy.utils import PliffyInfoABD, ABD
demo.py
from pliffy.utils import PliffyInfoABD, ABD
from pliffy.plot import plot_abd
估计值.py
from pliffy.utils import ABD
parser.py
from pliffy import estimate
from pliffy import utils
plot.py
import pliffy
utils.py
from pliffy import estimate
figure/init.py
from .figure import Figure
from .figure_ab import FigureAB
from .figure_diff import FigureDiff
from .diff_axis import DiffAxCreator
图/diff_轴py
from pliffy import utils, parser
figure/figure.py
from pliffy.parser import Xticks, Raw, Mean, CI, Paired
图/figure_ab.py
from pliffy.figure import Figure
from pliffy import parser
数字/数字差异py
from pliffy.figure import Figure
from pliffy import parser
如果需要更多信息,请告诉我
我查看了您发布的wheel,实际上它不包含您的
figure
子包为了了解原因,让我们检查一下您的
setup.py
您将包声明为
packages=["pliffy"]
,但未声明pliffy.figure
子包。由于这个原因,车轮包装商没有接受它更好的标准方法是使用}函数来为您发现包
setuptools
{packages=find_packages()
相关问题 更多 >
编程相关推荐