Notez que cibuildwheel construit python bwheel (y compris le module C ++) en masse avec CI et le télécharge sur PyPI

Si vous êtes un Han, vous souhaitez utiliser Python pip pour installer une roue prédéfinie qui comprend des modules C ++ sur Windows, macOS et Linux!

Faisons-le avec cibuildwheel!

https://github.com/joerick/cibuildwheel

C'est un script qui se construit dans divers environnements et versions de python. C'est génial. Vous pouvez l'intégrer dans votre propre CI de projet (travis, actions GitHub, etc.).

C'est un peu difficile à comprendre,

$ python3 -m cibuildwheel --output-dir wheelhouse

En exécutant, l'équivalent de python setup.py bdist_wheel sera construit et exécuté pour chaque environnement de version python. (Utilisez Docker pour Linux et macOS).

Exécutez le script avant de construire

Dans cibuildwheel, Linux et macOS sont exécutés dans le conteneur Docker, donc lors de l'exécution de CI build avec Travis etc., quelque chose comme git submodule update doit être exécuté à l'intérieur du conteneur docker.

Vous pouvez en définir dans les variables d'environnement de cibuildwheel.

https://cibuildwheel.readthedocs.io/en/latest/options/

Télécharger sur pypi

Remarque sur le téléchargement d'un package en binaire Linux vers PyPI https://qiita.com/syoyo/items/6185380b8d9950b25561

Prière de se référer à

Pipeline Azure ...?

Avec le pipeline Azure, l'automatisation du téléchargement après la construction avec de la ficelle, etc. semble être problématique à l'heure actuelle, mais le paramètre de vispy est-il utile?

https://github.com/vispy/vispy/blob/master/azure-pipelines.yml

Pour le moment, un modèle a été proposé, mais il semble qu'il y ait des restrictions.

https://github.com/joerick/cibuildwheel/issues/229

J'ai en fait essayé de l'utiliser avec tinyobjloader, mais la documentation en ligne était difficile à comprendre et cela me paraissait plus gênant que Travis. (Ce serait bien si la description yaml pouvait être vérifiée par la syntaxe avec un éditeur en ligne)

Si vous pouvez utiliser Travis, nous vous recommandons d'utiliser travis (ou actions Github).

Créer et publier un flux

      - task: PublishBuildArtifacts@1
        inputs:
          path: $(Build.ArtifactStagingDirectory)
          artifactName: tinyobjDeployWindows

En déploiement (téléchargement vers PyPI, par exemple), Vérifiez d'abord que la tâche dépendante est terminée (dependOn) et qu'il s'agit d'un commit de balise.

  - job: deployPyPI
    # Based on vispy: https://github.com/vispy/vispy/blob/master/azure-pipelines.yml
    pool: {vmImage: 'Ubuntu-16.04'}
    condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
    dependsOn:
      - linux
      - macos
      - windows

Ensuite, utilisez DownloadBuildArtifacts pour télécharger les artefacts du travail (en fait des dossiers).

      - task: DownloadBuildArtifacts@0
        inputs:
          artifactName: 'tinyobjDeployWindows'
          downloadPath: $(Pipeline.Workspace)

A ce moment, un dossier est créé avec ʻartifactName ($ (Pipeline.Workspace) / tinyobjDepoloyWinwdows`), et la construction y est placée. Pour le débogage, il semble bon de le sortir dans le journal avec ls etc. afin que vous puissiez le vérifier.

Ensuite, publiez avec de la ficelle et vous avez terminé!

      # Publish to PyPI through twine
      - bash: |
          cd $(Pipeline.Workspace)
          find .
          python -m pip install --upgrade pip
          pip install twine
          echo tinyobjDeployLinux/python/dist/*
          echo tinyobjDeployLinux/python/wheelhouse/* tinyobjDeployMacOS/python/wheelhouse/* tinyobjDeployWindows/python/wheelhouse/*
          twine upload -u "__token__" --skip-existing tinyobjDeployLinux/python/dist/* tinyobjDeployLinux/python/wheelhouse/* tinyobjDeployMacOS/python/wheelhouse/* tinyobjDeployWindows/python/wheelhouse/*
        env:
          TWINE_PASSWORD: $(pypiToken2)

Pour le mot de passe TWINE (jeton secret), enregistrez le jeton secret avec une variable sur le site Web Azure Pipeline avec le nom pypiToken2.

Impressions

Chaque fois que je pousse et déclenche la construction, attendez environ 10 minutes, corrigez-la si une erreur se produit et attachez à nouveau la balise et pousser est gênant, donc je veux un environnement où je peux l'essayer à portée de main.

Twine token

Azure Pipeline dispose également d'une fonction de variables secrètes qui peut gérer les jetons secrets Twine (PyPi), vous pouvez donc l'utiliser.

https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#secret-variables

La variable Secret est spécifiée via la variable d'environnement dans le script de construction.

Utiliser PublishBuildArtifacts

PublishPipelineArtifact imprime uniquement les journaux qui ne contiennent même pas le message d'erreur" Une ou plusieurs erreurs se sont produites "(aucune raison d'erreur n'est affichée) et cela ne fonctionne pas.

https://stackoverflow.com/questions/58841733/how-to-debug-azure-devops-task-publishpipelineartifact-when-one-or-more-errors-o

Utilisez PublishBuildArtifacts.

Exemple réel avec code C ++

cibuildwheel, téléchargement pypi,

pytinyexr (PyEXR) utilise Travis.

https://github.com/syoyo/PyEXR

tinyobjloader utilise Azure Pipeline.

https://github.com/tinyobjloader/tinyobjloader/blob/master/azure-pipelines.yml

Py2.7(or pypy) + Windows + pybind11

Au moins pypy provoquera une erreur de construction, alors assurez-vous d'inclure pp27-win32 et pp36-win32 dans CIBW_SKIP et ne compilez pas. (Quelqu'un utilise-t-il pypy?)

De plus, python2.7 + C ++ 11 est fondamentalement obsolète.

https://cibuildwheel.readthedocs.io/en/stable/cpp_standards/

À moins que vous n'ayez une bonne raison d'utiliser py27, vous ne devriez pas prendre en charge python 2.7.

Recommended Posts

Notez que cibuildwheel construit python bwheel (y compris le module C ++) en masse avec CI et le télécharge sur PyPI
Orienté objet en langage C: "○ ✕ game" a été refacturé et porté en Python
Notez que je comprends l'algorithme des moindres carrés. Et je l'ai écrit en Python.
Comment générer une séquence en Python et C ++
Convertissez des PDF en images en masse avec Python
Script Python qui explore le flux RSS du statut Azure et le publie sur Hipchat
Fileinput, un module qui facilite l'écriture de programmes de filtrage de type Perl en Python
Il est facile d'exécuter SQL avec Python et de générer le résultat dans Excel
Essayez de créer un module Python en langage C
Comment exécuter des tests avec Python unittest
[C / C ++] Passez la valeur calculée en C / C ++ à une fonction python pour exécuter le processus et utilisez cette valeur en C / C ++.
Une note qui déploie une application Python de Circle CI vers Elastic Beanstalk et avertit Slack
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
Essayez de le faire avec GUI, PyQt en Python
[Road to Intermediate Python] Installer des packages en masse avec pip
Installez CaboCha dans l'environnement Ubuntu et appelez-le avec Python.
Comment se connecter à AtCoder avec Python et soumettre automatiquement
Résumé des modules qui automatisent et facilitent l'installation de WebDriver avec Python
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
Unittest et CI en Python
Notez qu'il prend en charge Python 3
traitement pour utiliser les données notMNIST en Python (et essayé de les classer)
Comment installer OpenCV sur Cloud9 et l'exécuter en Python
Je veux résoudre APG4b avec Python (seulement 4.01 et 4.04 au chapitre 4)
Expressions régulières faciles et solides à apprendre en Python
Lisez le binaire big endian en Python et convertissez-le en ndarray
Jetez quelque chose dans Kinesis avec python et assurez-vous qu'il est dans
Notez que Python décode l'image au format base64 et l'enregistre localement
Notez que je comprends l'algorithme du classificateur Naive Bayes. Et je l'ai écrit en Python.
[AWS lambda] Déployer, y compris diverses bibliothèques avec lambda (générer un zip avec un mot de passe et le télécharger vers s3) @ Python