Python ImportError(很可能是由于循环导入)用于pip安装,但不用于local setup.py

2024-10-01 19:30:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的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

如果需要更多信息,请告诉我


Tags: frompyimport信息parservenvplotinit
1条回答
网友
1楼 · 发布于 2024-10-01 19:30:04

我查看了您发布的wheel,实际上它不包含您的figure子包

为了了解原因,让我们检查一下您的setup.py

您将包声明为packages=["pliffy"],但未声明pliffy.figure子包。由于这个原因,车轮包装商没有接受它

更好的标准方法是使用setuptools{}函数来为您发现包

packages=find_packages()

相关问题 更多 >

    热门问题