PyPI发布的Extractable库pip安装后无法导入问题排查
问题诊断与修复方案
核心问题
你的包安装后仅存在Extractable.dist-info元数据目录,缺少实际代码目录,导致Python无法识别为可导入模块。根源是构建配置未正确指定要包含的Python包/模块,使得PyPI上的包只打包了元数据,没有业务代码。
具体错误点
setup.py 配置误用:
- 使用了针对单文件模块的
py_modules参数,但你的项目是多文件包结构(Extractable/、TableGenerator/文件夹),应使用packages参数指定包。 py_modules中的路径写法错误,即使是单文件模块也需用模块名而非文件路径。- 未使用
find_packages()自动发现src目录下的包,导致构建时遗漏代码文件。
- 使用了针对单文件模块的
pyproject.toml 配置缺失:
[project]部分未指定packages字段,setuptools无法识别需要打包的包目录。
包结构不完整:
src/Extractable和src/TableGenerator目录大概率缺少__init__.py文件,Python无法将其识别为可导入的包。package_data配置了不存在的sample包资源,属于无效配置。
修复步骤
步骤1:补全包结构
在src/Extractable/和src/TableGenerator/目录下创建空的__init__.py文件(子目录如Datatypes也需添加),示例结构:
src/ ├── Extractable/ │ ├── __init__.py │ ├── Datatypes/ │ │ ├── __init__.py │ │ └── ... │ └── Extractor.py └── TableGenerator/ ├── __init__.py ├── CreatePDFTable.py └── fonts/ └── ...
步骤2:修正setup.py配置
替换py_modules为packages,使用find_packages()自动发现包:
from setuptools import setup, find_packages with open("README.md", "r") as fh: long_description = fh.read() setup( name='Extractable', version='0.0.2', description='Extract tables from PDFs', packages=find_packages(where='src'), package_dir={'': 'src'}, include_package_data=True, package_data={ 'Extractable': ['Datatypes/*'], 'TableGenerator': ['fonts/*'], }, long_description=long_description, long_description_content_type="text/markdown", classifiers=[ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "License :: OSI Approved :: MIT License", "Natural Language :: English" ], extras_require={ "dev": [ "pytest>=3.7", ], }, install_requires=[ "toolz ~= 0.12.0", "torch ~= 2.0.1", "Pillow ~= 9.5.0", "transformers ~= 4.29.2", "matplotlib >=3", "pdf2image ~= 1.16.3", "pdf2jpg ~= 1.1", "scipy ~= 1.10.1", "timm", "defusedxml", "Faker ~= 18.9.0" ], url="https://github.com/SuleyNL/Extractable", author="Suleymen C. Kandrouch", author_email="suleyleeuw@gmail.com", )
步骤3:修正pyproject.toml配置
在[project]部分添加packages字段:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "Extractable" version = "0.0.2" authors = [ { name="Suleymen C. Kandrouch ", email="suleyleeuw@gmail.com" }, ] description = "Extracting tables from PDFs" readme = {file = "README.md", content-type = "text/markdown"} requires-python = ">=3.7" classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ] license = {file = "LICENSE.txt"} dependencies = [ "toolz ~= 0.12.0", "torch ~= 2.0.1", "Pillow ~= 9.5.0", "transformers ~= 4.29.2", "matplotlib >=3", "pdf2image ~= 1.16.3", "pdf2jpg ~= 1.1", "scipy ~= 1.10.1", "timm", "defusedxml", "Faker ~= 18.9.0" ] packages = ["Extractable", "TableGenerator"] [project.urls] "Homepage" = "https://github.com/SuleyNL/Extractable" "Bug Tracker" = "https://github.com/SuleyNL/Extractable/issues"
步骤4:重新构建上传
- 清理旧构建文件:删除
build/、dist/、*.egg-info/目录 - 重新构建:
py -m build
- 上传新版本:
twine upload dist/*
验证修复
安装新版本后,检查Python的site-packages目录,若出现Extractable/和TableGenerator/目录,即可正常执行import Extractable。
内容的提问来源于stack exchange,提问作者suley
相关产品推荐
相关产品推荐

