Erreur relative à PyQt5 au lancement de Sakia

Bonjour,

J’essaye de packager Sakia 0.33.0rc4. Je le compile avec les dépendances suivantes :

  • python-pytest
  • python-pytest-asyncio
  • python-aiohttp
  • python-attrs
  • python-duniterpy
  • python-networkx
  • python-pyqt (5.9)
  • python-pyyaml
  • python-quamash

Durant la compilation les variables d’environnement PYTHONPATH et LIBRARYPATH contiennent une référence à PyQt.

La compilation se déroule sans erreur.

Toutefois, quand je lance le Sakia, avec l’export — tronqué — suivant :

export PYTHONPATH="...:/gnu/store/n27nb9krp9wg6a0ksyjis5vf9gk2x7ak-python-pyqt-5.9/lib/python3.6/site-packages:...${PYTHONPATH:+:}$PYTHONPATH"

J’obtiens l’erreur :

  Traceback (most recent call last):
  File "/gnu/store/7xcmrlkzpbab2x7mxw7xzjrxbx8sslnn-sakia-0.33.0rc4/bin/.sakia-real", line 6, in <module>
    from pkg_resources import load_entry_point
  File "/gnu/store/an8n5rh6fmkrnm3b6p62y97n1v4yd6qg-python-3.6.3/lib/python3.6/site-packages/pkg_resources/__init__.py", line 3017, in <module>
    @_call_aside
  File "/gnu/store/an8n5rh6fmkrnm3b6p62y97n1v4yd6qg-python-3.6.3/lib/python3.6/site-packages/pkg_resources/__init__.py", line 3003, in _call_aside
    f(*args, **kwargs)
  File "/gnu/store/an8n5rh6fmkrnm3b6p62y97n1v4yd6qg-python-3.6.3/lib/python3.6/site-packages/pkg_resources/__init__.py", line 3030, in _initialize_master_working_set
    working_set = WorkingSet._build_master()
  File "/gnu/store/an8n5rh6fmkrnm3b6p62y97n1v4yd6qg-python-3.6.3/lib/python3.6/site-packages/pkg_resources/__init__.py", line 659, in _build_master
    ws.require(__requires__)
  File "/gnu/store/an8n5rh6fmkrnm3b6p62y97n1v4yd6qg-python-3.6.3/lib/python3.6/site-packages/pkg_resources/__init__.py", line 967, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/gnu/store/an8n5rh6fmkrnm3b6p62y97n1v4yd6qg-python-3.6.3/lib/python3.6/site-packages/pkg_resources/__init__.py", line 853, in resolve
    raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'PyQt5<5.10,>=5.9' distribution was not found and is required by sakia

Pour information, dans le message d’erreur ci-dessus, “.sakia-real” est l’executable véritable, “sakia” est un wrapper avec l’export du $PYTHONPATH.

Bref, Sakia ne trouve pas PyQt, qui fait pourtant partie de $PYTHONPATH. Comment indiquer à Sakia où se trouve PyQt ? Ai-je omis quelque chose dans la compilation ?

Merci d’avance pour toute information,

Quel script est ce que tu lances exactement ?

Voici le script “sakia” dans son intégralité. Bon courage (et merci).

#!/gnu/store/mm0zclrzj3y7rj74hzyd0f224xly04fh-bash-minimal-4.4.12/bin/bash
export PYTHONPATH="/gnu/store/7xcmrlkzpbab2x7mxw7xzjrxbx8sslnn-sakia-0.33.0rc4/lib/python3.6/site-packages:/gnu/store/sczyi6ni86dq9g6dbl1wpm0vwzp4fak2-python-pytest-3.2.3/lib/python3.6/site-packages:/gnu/store/rrj6iwhm09mdlidwidnw6k59yq01gg99-python-pytest-asyncio-0.8.0/lib/python3.6/site-packages:/gnu/store/pj6vjz1dr9a00413rf3iaxkziarm8hag-python-aiohttp-3.1.3/lib/python3.6/site-packages:/gnu/store/yjlvdh1wyy3r6lkch2fxiy4gswa2824n-python-attrs-17.4.0/lib/python3.6/site-packages:/gnu/store/c6ms8aiybyxi26lqd31n7yrvrbn8qdyf-python-duniterpy-0.43.2/lib/python3.6/site-packages:/gnu/store/9m3a6ci2m4ri7qalz25slfis84gpr96p-python-networkx-2.1/lib/python3.6/site-packages:/gnu/store/n27nb9krp9wg6a0ksyjis5vf9gk2x7ak-python-pyqt-5.9/lib/python3.6/site-packages:/gnu/store/253gv6fykkgcr167nbq8084hbl9a164y-python-pyyaml-3.12/lib/python3.6/site-packages:/gnu/store/gm3cjkq6g2v1fqn4ds4f04l7k5insziw-python-quamash-0.6.0/lib/python3.6/site-packages:/gnu/store/an8n5rh6fmkrnm3b6p62y97n1v4yd6qg-python-3.6.3/lib/python3.6/site-packages:/gnu/store/kxviz8f1cncxr8r1jqhr54895pjrbjrk-python-py-1.4.34/lib/python3.6/site-packages:/gnu/store/m6rz3bkv9pl5ckpav0j528l0jp8c08j0-python-coverage-4.4.1/lib/python3.6/site-packages:/gnu/store/xq53pza9rz6rja3693rn29cs6421rb9l-python-async-generator-1.9/lib/python3.6/site-packages:/gnu/store/y26fdqbsq18f2dpf1lljvzk1fmx0z3ds-python-yarl-1.1.1/lib/python3.6/site-packages:/gnu/store/qdmjv4jw41zawaz4hq913xs57zglc6sc-python-multidict-4.2.0/lib/python3.6/site-packages:/gnu/store/66lp7fls00mhjhd87gaxa66dbid0yrqi-python-idna-ssl-1.0.1/lib/python3.6/site-packages:/gnu/store/0xir9iv9vy6g8l0586df3hj7p1x0812g-python-chardet-3.0.4/lib/python3.6/site-packages:/gnu/store/v54qhimf5rda5qrjqr67ajvzd6kb5blh-python-async-timeout-1.3.0/lib/python3.6/site-packages:/gnu/store/0cxrm9hm9r7k99a0xn4732yccn2rfh89-python-aiodns-1.1.1/lib/python3.6/site-packages:/gnu/store/23hwplcjdblsy6hcggf75rd69x29x7zk-python-zope-interface-4.1.3/lib/python3.6/site-packages:/gnu/store/wdwfrkazcfn9rvyp11fvgalv8yljqix4-python-sphinx-1.5.1/lib/python3.6/site-packages:/gnu/store/z4p9iia8qm37pznvisrkrcc5m3va92v6-python-six-1.11.0/lib/python3.6/site-packages:/gnu/store/xj9ap105mvjsngy3p8d93f69c77masgr-python-hypothesis-3.1.0/lib/python3.6/site-packages:/gnu/store/yqqp8xpjx51wdj03k8x4g4lcw30lfa8j-python-pypeg2-2.15.2/lib/python3.6/site-packages:/gnu/store/d87byhj15688kqvkp1ghck6zm8bliqz4-python-pylibscrypt-1.7.1/lib/python3.6/site-packages:/gnu/store/dk5k3wg1czf38jk1xgxzlljx2y2sx2ba-python-libnacl-1.6.1/lib/python3.6/site-packages:/gnu/store/rz3gf1wigkjy8k07j0h7rpjs07a0c9wm-python-jsonschema-2.6.0/lib/python3.6/site-packages:/gnu/store/7lazy15w7322f8d0sy1bm5csjgjc8y4b-python-base58-0.2.5/lib/python3.6/site-packages:/gnu/store/4xrw0288r4jdnhlf5smpmiknvk8rcy3v-python-decorator-4.2.1/lib/python3.6/site-packages:/gnu/store/77186b91za2fk202ixd9jzn01nd4dhb7-python-sip-4.19.3/lib/python3.6/site-packages:/gnu/store/ncgnd49nih3sd4ajh076f5ml8siw977w-python-idna-2.6/lib/python3.6/site-packages:/gnu/store/48z9n3xv27pdpggyfqgyjw1qjhc89dzf-python-pytest-runner-2.11.1/lib/python3.6/site-packages:/gnu/store/srag0f2q3w5lvm1fifyiy4d87z7b3ryi-python-pycares-2.3.0/lib/python3.6/site-packages:/gnu/store/s39ivkh56fmk2ivgcf62p3wqcy6cr9c5-python-requests-2.13.0/lib/python3.6/site-packages:/gnu/store/aik59j0aw9qsaivgmgs4y6snn0z2498g-python-pygments-2.2.0/lib/python3.6/site-packages:/gnu/store/334raqjc0cmx694z0d5ky1jw948q1qrj-python-jinja2-2.9.6/lib/python3.6/site-packages:/gnu/store/1vgh553910nv00pkcgvqnyglv23z1wb8-python-docutils-0.14/lib/python3.6/site-packages:/gnu/store/g7m522kwnk574310n2vkd116k7yl8zcb-python-snowballstemmer-1.2.1/lib/python3.6/site-packages:/gnu/store/qdz6zrxinhv1yqw6s2zlai3a5gh8c60c-python-babel-2.3.4/lib/python3.6/site-packages:/gnu/store/10mlmmc1qimlflqfjad9df8s8ccsffwi-python-sphinx-alabaster-theme-0.7.9/lib/python3.6/site-packages:/gnu/store/dz48x76vhhvh1lf2x710drkbmlymlfa3-python-imagesize-0.7.1/lib/python3.6/site-packages:/gnu/store/r9mllf97fil283zr4aml0y7x0sngi4hk-python-lxml-3.8.0/lib/python3.6/site-packages:/gnu/store/jwmds2093z411l50dzs2y5y4p7r6i00y-python-pyhamcrest-1.9.0/lib/python3.6/site-packages:/gnu/store/rpi0z3qgkgqzvg2cg18z4a4462l581ga-python-markupsafe-0.23/lib/python3.6/site-packages:/gnu/store/zka43ycyxyg0a596lcnanz0p2hsyld79-python-pytz-2017.3/lib/python3.6/site-packages${PYTHONPATH:+:}$PYTHONPATH"
exec -a "$0" "/gnu/store/7xcmrlkzpbab2x7mxw7xzjrxbx8sslnn-sakia-0.33.0rc4/bin/.sakia-real" "$@"

Pour information, le script “.sakia-real” est celui fourni par Sakia lui-même :

#!/gnu/store/znhba1q3b4pdf9arslp2a18xagdj707r-python-wrapper-3.6.3/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'sakia==0.33.0rc4','console_scripts','sakia'
__requires__ = 'sakia==0.33.0rc4'
import re
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(
        load_entry_point('sakia==0.33.0rc4', 'console_scripts', 'sakia')()
    )

Quelle procédure as tu suivi pour génerer ce fichier ?

Le script “.sakia-real” est généré automatiquement par les outils de la distribution, en fonction des dépendances que je déclare dans le package, pour chaque script Python dans “bin/”.

Par ailleurs, je suppose que je dois ajouter Qt aux dépendances (PyQt sans Qt…), mais quelle partie ? Et quid de libsodium. Est-ce aussi une dépendance de Sakia ?

Il me semble que PyQt package ses propres dépendances, mais je pense qu’il vaut mieux avoir Qt en dépendance native oui.

libsodium est une dépendance de sakia !

Il est possible que PyQt ne soit pas trouvé parce que Qt n’est pas trouvé.

Quel outils de packaging utilises tu ?

J’ai essayé de mettre Qt en dépendance : même résultat. Le problème ne vient pas de là. PyQt vient en effet avec ses propres dépendances.

J’ai rajouté libsodium comme dépendance, mais où est-il requis ? Je n’ai pas trouvé d’import libsodium dans le code source.

Je ne sais pas exactement ce que tu entends par outils de packaging. Grosso modo, la distribution fait

python setup.py build

puis

python setup.py install --prefix=...

Ensuite il y a le wrapper final pour que PYTHONPATH corresponde bien aux dépendances et que l’exécutable n’aille pas chercher les bibliothèques ailleurs dans le système.

Je vois où le script d’installation détecte PyQt — et il ne dit rien à ce sujet — mais je ne vois pas où, dans les sources, cela pose problème. Enfin, le message d’erreur indique que c’est lors de l’exécution de

from pkg_resources import load_entry_point

Est-ce qu’il check “requirements.txt” même lors du run-time ?

libsodium est utilisé par pylibscrypt et libnacl !

Je vois que tu tournes sous python 3.6. La version sur laquelle j’ai construit le build est la version python 3.5.4. Peut être est-ce l’origine de ton problème ?

Pour libsodium, n’est-ce pas le même problème que Qt ? Il fait déjà partie des dépendances de pylibscrype et libnacl. Si la bibliothèque n’est pas utilisée directement, est-ce tout de même utile de le rajouter aux dépendances ?

Pour Python, c’est un peu plus compliqué. Python 3.5.4 n’est plus packagé dans la distribution. Je peux ré-écrire le package pour tester, mais il y a peut-être plus rapide : as-tu la possibilité de tester le build avec Python 3.6.3 ?