python - 创建一个包含多个 python 文件的包
问题描述
我有一个文件夹结构:
setup_seplot.py
seplot/
__init__.py (empty)
seplot.py
kw_dictionaries.py
在 seplot.py 中,我有:
import kw_dictionaries as kd
如果我运行 seplot.py,一切正常。
但是,当我使用 setup_seplot.py 时出现问题:
python setup_seplot.py sdist bdist_wheel
Traceback (most recent call last):
File "setup_seplot.py", line 2, in <module>
from seplot import seplot as sep
File "/home/XXXXX/code/Python-Tools/seplot/seplot.py", line 14, in <module>
import kw_dictionaries as kd
ModuleNotFoundError: No module named 'kw_dictionaries'
这个问题似乎来自于在 setup_seplot 中,我导入 seplot 以获取版本:
setup_seplot.py :
from setuptools import setup, Extension, find_packages
from seplot import seplot as sep
version=sep.__VERSION__
setup(
name='seplot',
version=version,
description="A front-end for Python PyX",
install_requires=[ 'pyx', ],
packages=find_packages(),
scripts=['seplot/bin/seplot','seplot/seplot.py',
'seplot/kw_dictionaries.py','seplot/style_dictionaries.py']
)
如果在 seplot.py 我替换
import kw_dictionaries as kd
经过 :
from . import kw_dictionaries as kd
然后设置工作正常,但代码(setup.py)没有。我在这里很迷茫。
解决方案
- 使用distutils中的旧样式将脚本和包分开。或者更好的是,使用setuptools的入口点。
scripts
console_scripts
- 始终在可执行脚本中使用绝对导入(如果有的话)。
- 根据您的喜好在包中使用绝对或相对导入(我相信从长远来看绝对会更好)。
- 在安装脚本中,不要从项目中导入包。将版本字符串保存在
setup.cfg
(或setup.py
)中,并用于importlib_metadata.version('ProjectName')
从您的实际代码中读取。
推荐阅读
- java - 当请求没有匹配的 API 时,为什么我的控制器调用不同的 API?
- javascript - 未捕获的 ReferenceError:AddAnime 未在 HTMLInputElement.onclick 中定义(AnimeSite.html:51)
- google-drive-api - 如何访问应用程序数据文件夹中的所有文件
- python - lambda 什么时候开始捕获自由变量?
- python - 将导入的变量作为参数时,“os”包中的某些函数行为异常
- python - 有没有办法打印这个未显示的标签文本?
- php - 如何在 PHP 中正确调用 gmdate()?
- java - 启动对象非静态变量时,无法从静态上下文中引用它
- twilio - 适用于 Twilio 可编程视频服务器端的 SDK,即 REST API
- java - E/MediaRecording:外部存储访问错误