Je fais mes premiers pas dans python packages distributions.
Malheureusement, j'ai ModuleNotFoundError
après une installation réussie à partir de pip.
La mise en page de mes répertoires est assez simple:
maindir
|- setup.py
|- pysoft
|- __init__.py
|- main.py
|- pylib.py
main.py:
import pylib
def main():
print("main program")
pylib.libfunc()
if __name__ == '__main__':
main()
pylib.py:
def libfunc():
print("lib func")
setup.py:
import setuptools
setuptools.setup(
name='pysoft',
version='0.0.21',
author='als',
author_email='[email protected]',
description='deploy tester',
py_modules=['pylib'],
packages=setuptools.find_packages(),
python_requires='>=3.6',
entry_points={
'console_scripts': [
'pysoft = pysoft.main:main',
],
},
)
Je fais l'empaquetage et le téléchargement sur test.pypi.org:
python3 setup.py sdist bdist_wheel
python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
Je configure et démarre un nouveau virtualenv
et installe mon package:
python3 -m pip install -i https://test.pypi.org/simple/ pysoft
Ensuite, j'essaye de l'exécuter, mais j'ai une erreur:
pysoft
Traceback (most recent call last):
File "/home/fat/buff/tt/bin/pysoft", line 5, in <module>
from pysoft.main import main
File "/home/fat/buff/tt/lib/python3.6/site-packages/pysoft/main.py", line 1, in <module>
import pylib
ModuleNotFoundError: No module named 'pylib'
Pourriez-vous savoir où je me trompe?
Vous faites import pylib
Comme si dit pylib
est un module ou un package de niveau supérieur. Mais ce n'est pas le cas - c'est un sous-module du package pysoft
. Pour une importation correcte, procédez comme suit:
from pysoft import pylib
py_modules=['pylib']
Dans votre setup.py
Est ignoré car setuptools
ne peut pas trouver le niveau supérieur pylib.py
. Mais packages=setuptools.find_packages()
fonctionne et inclut le package pysoft
dans les distributions.