Beachten Sie, dass cibuildwheel das Python-Rad (einschließlich des C ++ - Moduls) in großen Mengen mit CI erstellt und auf PyPI hochlädt

Wenn Sie ein Han sind, möchten Sie Python Pip verwenden, um ein vorgefertigtes Rad zu installieren, das C ++ - Module unter Windows, MacOS und Linux enthält!

Lass es uns mit Cibuildwheel machen!

https://github.com/joerick/cibuildwheel

Es ist ein Skript, das in verschiedenen Umgebungen und Python-Versionen erstellt wird. Es ist großartig. Sie können dies in Ihr eigenes Projekt-CI (Travis, GitHub-Aktionen usw.) integrieren.

Es ist ein wenig schwer zu verstehen,

$ python3 -m cibuildwheel --output-dir wheelhouse

Durch Ausführen wird für jede Python-Versionsumgebung das Äquivalent python setup.py bdist_wheel erstellt und ausgeführt. (Verwenden Sie Docker für Linux und MacOS).

Führen Sie das Skript vor dem Erstellen aus

In cibuildwheel werden Linux und macOS im Docker-Container ausgeführt. Wenn Sie also einen CI-Build mit Travis usw. durchführen, muss im Docker-Container so etwas wie "git submodule update" ausgeführt werden.

Sie können einige in den Umgebungsvariablen von cibuildwheel festlegen.

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

Auf pypi hochladen

Beachten Sie, dass Sie ein Paket in Linux-Binärdatei auf PyPI hochladen https://qiita.com/syoyo/items/6185380b8d9950b25561

Bitte beziehen Sie sich auf

Azure-Pipeline ...?

Mit der Azure-Pipeline scheint die Upload-Automatisierung nach dem Erstellen mit Bindfaden usw. derzeit problematisch zu sein. Ist die Einstellung von vispy jedoch hilfreich?

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

Derzeit wurde eine Vorlage vorgeschlagen, es scheint jedoch einige Einschränkungen zu geben.

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

Ich habe tatsächlich versucht, es mit tinyobjloader zu verwenden, aber die Online-Dokumentation war schwer zu verstehen und fühlte sich problematischer an als Travis. (Es wäre schön, wenn die yaml-Beschreibung mit einem Online-Editor syntaktisch überprüft werden könnte.)

Wenn Sie Travis verwenden können, empfehlen wir die Verwendung von Travis (oder Github-Aktionen).

Flow erstellen und veröffentlichen

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

Beim Bereitstellen (Hochladen auf z. B. PyPI) Überprüfen Sie zunächst, ob die abhängige Aufgabe abgeschlossen ist (abhängigeOn) und ob es sich um ein Tag-Commit handelt.

  - 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

Verwenden Sie dann "DownloadBuildArtifacts", um die Jobartefakte (tatsächlich Ordner) herunterzuladen.

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

Zu diesem Zeitpunkt wird ein Ordner mit "artefaktname" ("$ (Pipeline.Workspace) / tinyobjDepoloyWinwdows") erstellt und der Build darin abgelegt. Zum Debuggen scheint es gut, es mit ls usw. in das Protokoll auszugeben, damit Sie es überprüfen können.

Dann mit Schnur veröffentlichen und fertig!

      # 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)

Registrieren Sie für das TWINE-Kennwort (geheimes Token) das geheime Token mit Variable auf der Azure Pipeline-Website unter dem Namen "pypiToken2".

Impressionen

Warten Sie jedes Mal, wenn ich den Build drücke und auslöse, etwa 10 Minuten, beheben Sie ihn, wenn ein Fehler auftritt, und hängen Sie das Tag erneut an. Das Drücken ist problematisch. Daher möchte ich eine Umgebung, in der ich es ausprobieren kann.

Twine token

Die Azure-Pipeline verfügt auch über eine Funktion für geheime Variablen, die geheime Twine-Token (PyPi) verarbeiten kann. Sie können diese also verwenden.

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

Die Secret-Variable wird über die Umgebungsvariable im Build-Skript angegeben.

Verwenden Sie PublishBuildArtifacts

PublishPipelineArtifact gibt nur Protokolle aus, die nicht einmal die Fehlermeldung Ein oder mehrere Fehler sind aufgetreten (es wird kein Fehlergrund angezeigt) und funktionieren nicht.

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

Verwenden Sie "PublishBuildArtifacts".

Aktuelles Beispiel mit C ++ - Code

cibuildwheel, pypi upload,

pytinyexr (PyEXR) verwendet Travis.

https://github.com/syoyo/PyEXR

tinyobjloader verwendet die Azure-Pipeline.

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

Py2.7(or pypy) + Windows + pybind11

Zumindest pypy verursacht einen Build-Fehler. Fügen Sie daher pp27-win32 und pp36-win32 in CIBW_SKIP ein und erstellen Sie nicht. (Benutzt jemand Pypy?)

Außerdem ist Python2.7 + C ++ 11 grundsätzlich veraltet.

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

Sofern Sie keinen starken Grund haben, py27 zu verwenden, sollten Sie Python 2.7 nicht unterstützen.

Recommended Posts

Beachten Sie, dass cibuildwheel das Python-Rad (einschließlich des C ++ - Moduls) in großen Mengen mit CI erstellt und auf PyPI hochlädt
Objektorientiert in C-Sprache: "○ ✕ game" wurde überarbeitet und nach Python portiert
Beachten Sie, dass ich den Algorithmus der kleinsten Quadrate verstehe. Und ich habe es in Python geschrieben.
So generieren Sie eine Sequenz in Python und C ++
Konvertieren Sie PDFs mit Python in Massenbilder
Python-Skript, das das Azure-Status-RSS crawlt und an Hipchat sendet
Fileinput, ein Modul, das das Schreiben von Perl-ähnlichen Filterprogrammen in Python erleichtert
Es ist einfach, SQL mit Python auszuführen und das Ergebnis in Excel auszugeben
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
So führen Sie Tests zusammen mit Python unittest aus
[C / C ++] Übergeben Sie den in C / C ++ berechneten Wert an eine Python-Funktion, um den Prozess auszuführen, und verwenden Sie diesen Wert in C / C ++.
Ein Hinweis, der eine Python-Anwendung von Circle CI auf Elastic Beanstalk bereitstellt und Slack benachrichtigt
Rufen Sie die Excel-Liste rekursiv in einem bestimmten Ordner mit Python ab und schreiben Sie sie in Excel.
Versuchen Sie es mit GUI, PyQt in Python
[Road to Intermediate Python] Installieren Sie Pakete in großen Mengen mit pip
Installieren Sie CaboCha in der Ubuntu-Umgebung und rufen Sie es mit Python auf.
So melden Sie sich mit Python bei AtCoder an und senden automatisch
Zusammenfassung der Module, die die Installation von WebDriver mit Python automatisieren und unterstützen
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden
Unittest und CI in Python
Beachten Sie, dass es Python 3 unterstützt
Verarbeitung zur Verwendung von notMNIST-Daten in Python (und versucht, sie zu klassifizieren)
So installieren Sie OpenCV in Cloud9 und führen es in Python aus
Ich möchte APG4b mit Python lösen (nur 4.01 und 4.04 in Kapitel 4)
Reguläre Ausdrücke, die in Python leicht und solide zu erlernen sind
Lesen Sie die Big-Endian-Binärdatei in Python und konvertieren Sie sie in ndarray
Wirf etwas mit Python in Kinesis und stelle sicher, dass es drin ist
Beachten Sie, dass Python Bilder im Base64-Format dekodiert und lokal speichert
Beachten Sie, dass ich den Algorithmus des maschinell lernenden Naive Bayes-Klassifikators verstehe. Und ich habe es in Python geschrieben.
[AWS lambda] Stellen Sie mit lambda verschiedene Bibliotheken bereit (generieren Sie eine Zip-Datei mit einem Kennwort und laden Sie sie auf s3 hoch) @ Python