Ich werde versuchen, eine Python-Verzeichnisstruktur zu erstellen, die ich später nicht bereuen werde

Es ist schon eine Weile her, dass ich angefangen habe, mit Python zu programmieren, und ich habe die Verzeichnisstruktur verstanden, also werde ich sie zusammenfassen. Zuerst habe ich es überhaupt nicht verstanden und ich wurde ziemlich gut gegoogelt, also habe ich es in Schritten geschrieben, damit selbst Anfänger es verstehen können.

Das Folgende ist ein Memo eines Ingenieurs, der seit etwa einem halben Jahr mit Python entwickelt. ** Wir wären Ihnen dankbar, wenn Sie uns viele Vorschläge und Vorschläge für bessere Methoden sowie Fragen von Anfängern geben könnten. ** ** **

Einführung

Als ich Python zum ersten Mal berührte, schrieb ich vorerst viele Methoden in hoge.py, und schließlich gab es mehrere Dateien und mehr Verzeichnisse. Wenn ich dies tat, konnte ich die Abhängigkeiten in meinem eigenen Programm jedoch nicht auflösen, und die Struktur wurde immer unverständlicher, und ich fand es schwierig, sie später zu korrigieren.

Daher halte ich es für wichtig, zuerst "Verzeichnisse und Dateien vorzubereiten, damit sie leicht in eine Bibliothek umgewandelt werden können" **, es sei denn, es handelt sich um eine sehr dringende Programmierung. Ich werde die Vorlage in diesem Artikel erstellen.

Schreiben Sie zuerst aus setup.py

Erstellen Sie zunächst ein python_package-Verzeichnis als Projektordner und erstellen Sie eine neue setup.py. Der Bereich direkt unter dem Projekt ist natürlich wie unten gezeigt.

.
└── setup.py

** setup.py ist unbedingt erforderlich, wenn Sie Ihr eigenes Programm als Bibliothek bereitstellen. ** **.

Lassen Sie uns vorerst ausfüllen, was derzeit eingegeben werden kann. Sie bestimmen den Namen des Projekts, das Sie erstellen möchten, und den Speicherort der Quelle.

setup.py


from setuptools import setup

setup(
    name="koboripackage",
    version='1.0',
    description='Zum Testen der Python-Verzeichnisstruktur',
    author='Kobori Akira',
    author_email='[email protected]',
    url='https://github.com/koboriakira/python_package',
)

Wenn das zu erstellende Produkt klar ist, können Sie zu diesem Zeitpunkt README.md erstellen.

Ich werde versuchen, es vorerst zu einer Bibliothek zu machen

Nach dem Schreiben von setup.py besteht der nächste Schritt darin, das Quellverzeichnis vorzubereiten.

Erstellen Sie ein Verzeichnis mit demselben Namen, den Sie in name von setup geschrieben haben, und fügen Sie vorerst \ _ \ _ init \ _ \ _.py ein. Eine leere Datei ist in Ordnung. Erstellen Sie auch eine Python-Datei mit demselben Dateinamen wie der Verzeichnisname. Angenommen, dies ist ein Modul, das als Bibliothek verwendet wird.

.
├── koboripackage
│   ├── __init__.py
│   └── koboripackage.py
└── setup.py

koboripackage.py


def hello(name):
    print('Hello, %s!' % name)

Wenn die Erstellung abgeschlossen ist, führen Sie python setup.py sdist in dem Verzeichnis aus, das setup.py enthält.

$ python setup.py sdist
running sdist
running egg_info
.
.
.
creating dist
Creating tar archive
removing 'koboripackage-1.0' (and everything under it)

Dann erhöhte sich die Anzahl der Dateien auf verschiedene Weise.

.
├── dist
│   └── koboripackage-1.0.tar.gz
├── koboripackage
│   ├── __init__.py
│   └── koboripackage.py
├── koboripackage.egg-info
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   ├── dependency_links.txt
│   └── top_level.txt
└── setup.py

Von diesen ist der in dist enthaltene Teer eine Bibliothek, die jeder mit "pip install" verwenden kann. Wir haben die Bibliothek noch nicht veröffentlicht. Geben Sie diesen Teer zunächst direkt an und platzieren Sie ihn lokal.

pip install dist/koboripackage-1.0.tar.gz

Mal sehen, ob es tatsächlich als Bibliothek verwendet werden kann. Führen Sie Python in der CLI aus.

$ python
>>> from koboripackage import koboripackage
>>> koboripackage.hello('World')
Hello, World!
>>> 

Auf diese Weise konnte ich die von mir erstellten Module und Funktionen importieren und verwenden. Sie können die Bibliothek mit pip uninstall koboripackage deinstallieren.

Stellen Sie es in CLI zur Verfügung

In Python erstellte Bibliotheken können auch über das Terminal in der Befehlszeile ausgeführt werden.

Fügen wir dazu eine Einstellung hinzu. Erstellen Sie zunächst cli.py direkt unter dem Quellverzeichnis.

cli.py


def execute():
    print('Der Befehl wurde ausgeführt!')

Bearbeiten Sie dann setup.py.

  1. Setzen Sie version auf 1.1
  2. Fügen Sie zum Importieren find_packages hinzu und fügen Sie packages = find_packages () hinzu
  3. Fügen Sie entry_points hinzu. Das Format wird mit "Befehlsname = Modul: Methode" geschrieben

setup.py


from setuptools import setup, find_packages

setup(
    name="koboripackage",
    version='1.1',
    description='Zum Testen der Python-Verzeichnisstruktur',
    author='Kobori Akira',
    author_email='[email protected]',
    url='https://github.com/koboriakira/python_package',
    packages=find_packages(),
    entry_points="""
      [console_scripts]
      koboripackage = koboripackage.cli:execute
    """,
)

Führen Sie "python setup.py sdist" erneut aus, wenn Sie fertig sind. Anschließend wird in dist ein neuer Tar für Version 1.1 erstellt, und die Konfiguration ist wie folgt.

.
├── dist
│   ├── koboripackage-1.0.tar.gz
│   └── koboripackage-1.1.tar.gz
├── find_package.txt
├── koboripackage
│   ├── __init__.py
│   ├── cli.py
│   └── koboripackage.py
├── koboripackage.egg-info
└── setup.py

Versuchen Sie nach wie vor, die Bibliothek mit pip install dist / koboripackage-1.1.tar.gz zu installieren. Dann

$ koboripackage
Der Befehl wurde ausgeführt!

Sie können sehen, dass die Ausführungsmethode von cli.py nur mit dem oben beschriebenen Befehlsnamen ausgeführt werden kann.

(Ergänzung) Über \ _ \ _ init \ _ \ _. Py und find_packages ()

Es mag falsch sein, aber ich werde mein Verständnis aufschreiben.

find_packages () ist eine Methode, um die Quelle zu finden, die Sie zum Erstellen von tar mit python setup.py sdist benötigen. Und Sie benötigen "__init __. Py" für die Suche.

Nur in diesem Kapitel werden wir das Unterverzeichnis und die Datei sub_module.py zum Quellverzeichnis hinzufügen.

.
├── koboripackage
│   ├── __init__.py
│   ├── cli.py
│   ├── koboripackage.py
│   └── sub
│       ├── __init__.py
│       └── sub_module.py
├── setup.py

Wenn zu diesem Zeitpunkt kein \ _ \ _ init \ _ \ _. Py im Unterverzeichnis vorhanden ist, findet find_packages () die Dateien nicht im und im Unterverzeichnis.

Sie können überprüfen, welche Datei Sie finden = in SOURCES.txt in Ei-Info verpackt.

$ cat koboripackage.egg-info/SOURCES.txt 
MANIFEST.in
requirements.txt
setup.py
koboripackage/__init__.py
koboripackage/cli.py
koboripackage/koboripackage.py
koboripackage.egg-info/PKG-INFO
koboripackage.egg-info/SOURCES.txt
koboripackage.egg-info/dependency_links.txt
koboripackage.egg-info/entry_points.txt
koboripackage.egg-info/requires.txt
koboripackage.egg-info/top_level.txt
koboripackage/sub/__init__.py
koboripackage/sub/sub_module.py
tests/__init__.py

Nutzung der vorhandenen Bibliothek

Versuchen Sie, eine vorhandene Bibliothek in cli.py zu importieren.

cli.py


import requests


def execute():
    print('Der Befehl wurde ausgeführt!')
    response = requests.get('https://www.google.com/')
    print(response.status_code)

Um Anforderungen (lokal) zu verwenden, müssen Sie die Bibliothek mit "pip install request" importieren. In ähnlicher Weise muss bei der Bereitstellung als Bibliothek angegeben werden, "was importiert werden muss".

Bereiten Sie dafür die Datei require.txt vor. Platzieren Sie es direkt unter dem Projekt.

requirements.txt


requests==2.23.0

Übrigens können Sie die gewünschte Bibliothek und Version mit dem Befehl pip freeze überprüfen. Alle derzeit installierten Bibliotheken werden jedoch ausgegeben. Wenn Sie also kopieren und einfügen, können Sie unnötige Bibliotheken einschließen.

Nehmen Sie als Nächstes zwei Einstellungen vor, damit die Datei require.txt beim Erstellen von tar mit python setup.py sdist korrekt verwendet wird.

  1. Erstellen Sie eine neue MANIFEST.in
  2. Fügen Sie install_requires zu setup.py (und Version 1.2) hinzu.
.
├── MANIFEST.in
├── dist
├── koboripackage
│   ├── __init__.py
│   ├── cli.py
│   └── koboripackage.py
├── koboripackage.egg-info
├── requirements.txt
└── setup.py

MANIFEST.in


include requirements.txt

setup.py


from setuptools import setup, find_packages

setup(
    name="koboripackage",
    version='1.2',
    description='Zum Testen der Python-Verzeichnisstruktur',
    author='Kobori Akira',
    author_email='[email protected]',
    url='https://github.com/koboriakira/python_package',
    packages=find_packages(),
    entry_points="""
      [console_scripts]
      koboripackage = koboripackage.cli:execute
    """,
    install_requires=open('requirements.txt').read().splitlines(),
)

** MANIFEST.in kann "etwas hinzufügen, das normalerweise nicht enthalten ist, wenn es verpackt ist (und umgekehrt)" **. Da wir "include require.txt" geschrieben haben, fügen wir beim Verpacken "require.txt" hinzu.

Geben Sie dann mit "install_requires" zum Setup die erforderlichen Bibliotheken an. Sie können den Bibliotheksnamen direkt als Array angeben, es scheint jedoch üblich zu sein, den Inhalt von require.txt wie oben beschrieben zu lesen.

install_requires=['requests']

Wenn Sie fertig sind, erstellen Sie einen v1.2-Tar mit einer Datei mit "python setup.py sdist". Wenn ich den Befehl nach der Installation der neuen Version der Bibliothek mit pip install dist / koboripackage-1.2.tar.gz ausführe,

$ koboripackage
Der Befehl wurde ausgeführt!
200

Sie können sehen, dass die Bibliothek wie oben verfügbar ist.

Auf PyPi hochladen

Wenn Sie sich bisher vorbereitet haben, können Sie sich in PyPi (Python Package Index) registrieren. Das spezifische Verfahren finden Sie unter https://blog.amedama.jp/entry/2017/12/31/175036. Wenn Sie es erfolgreich hochladen können, können Sie es mit "pip install koboripackage" installieren.

Bereiten Sie Tests vor

Seien Sie auf das Testen vorbereitet.

Erstellen Sie einen Testordner direkt unter dem Projekt. Erstellen Sie eine Test-Python-Datei mit derselben Struktur wie das Verzeichnis, in dem sich die Quelle befindet (fügen Sie dem Präfix einen Test hinzu). Vergessen Sie nicht \ _ \ _ init \ _ \ _. Py.

.
├── MANIFEST.in
├── dist
├── koboripackage
│   ├── __init__.py
│   ├── cli.py
│   └── koboripackage.py
├── koboripackage.egg-info
├── requirements.txt
├── setup.py
└── tests
    ├── __init__.py
    └── test_koboripackage.py

Schreiben Sie die Quelle für koboripackage.py und test_koboripackage.py wie folgt, um das Verhalten von multiply () zu überprüfen.

koboripackage.py


def hello(name):
    print('Hello, %s!' % name)


def multiply(a, b):
    return a * b

test_koboripackage.py


from koboripackage import koboripackage


def test_multiply():
    assert koboripackage.multiply(2, 3) == 6

Installieren Sie pytest mit pip install pytest und führen Sie dann pytest aus.

$ pytest
================================================================================================== test session starts ==================================================================================================
platform darwin -- Python 3.8.2, pytest-5.4.1, py-1.8.1, pluggy-0.13.1
rootdir: ...............
collected 1 item                                                                                                                                                                                                        

tests/test_koboripackage.py .                                                                                                                                                                                     [100%]

=================================================================================================== 1 passed in 0.02s ===================================================================================================

Sie haben jetzt ein allgemeines Python-Projekt erstellt.

Bereiten Sie Docker und Git vor

Schließlich werde ich ein Docker-Image vorbereiten, weil es eine große Sache ist. Erstellen Sie nach dem Hinzufügen der erforderlichen Dateien ein Image mit der zuvor installierten Bibliothek.

FROM python:3.7.5-slim

WORKDIR /work

ADD koboripackage koboripackage
ADD tests tests
ADD requirements.txt requirements.txt
ADD setup.py setup.py
ADD MANIFEST.in MANIFEST.in

RUN pip install --upgrade pip \
  && pip install -r requirements.txt \
  && pip install pytest

CMD bash

Erstellen Sie ein Image mit "docker build -t python_package" und erstellen Sie einen Container mit "docker run -it --rm python_package". Sie können jetzt "pytest" in einem Docker-Container ausführen. Wenn Sie es so entwickeln möchten, wie es ist, können Sie die Quelle wie folgt freigeben.

docker run -it --rm -v $(pwd)/koboripackage:/work/koboripackage -v $(pwd)/tests:/work/tests  python_package

Schieben Sie dies schließlich zu Github. Einige der während dieses Vorgangs erstellten Dateien müssen nicht auf github hochgeladen werden. Bereiten Sie daher .gitignore vor.

.gitignore


**/__pycache__
dist/
koboripackage.egg-info/

schließlich

Das auf diese Weise erstellte Paket lautet wie folgt. Ich habe es auch auf Ichiou PyPi hochgeladen. https://github.com/koboriakira/python_package

Ursprünglich schrieb ich die Lizenz in setup.py, aber ich hatte nicht das Vertrauen, sie einzugeben, also habe ich sie diesmal vermieden. Derzeit ist uns nur bewusst, "ich frage mich, ob es vorerst MIT sein sollte".

Durch die Vorbereitung eines Zustands, der von Anfang an auf diese Weise in eine Bibliothek umgewandelt werden kann, hoffe ich, dass es einfacher wird, Komponenten mit angemessener Größe bewusst zu erstellen.

Referenz

Recommended Posts

Ich werde versuchen, eine Python-Verzeichnisstruktur zu erstellen, die ich später nicht bereuen werde
Erstellen Sie ein Verzeichnis mit Python
Erstellen wir ein Skript, das sich bei Ideone.com in Python registriert.
Erstellen wir eine virtuelle Umgebung für Python
Erstellen wir mit Python eine kostenlose Gruppe
[Python] Erstellen Sie einen LineBot, der regelmäßig ausgeführt wird
Erstellen wir eine Kundendatenbank, in der QR-Code automatisch in Python ausgegeben wird
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
Python: Erstellen Sie eine Klasse, die entpackte Zuweisungen unterstützt
Python Erstellen von Funktionen, an die Sie sich später erinnern können
Erstellen Sie ein Plugin, mit dem Sie in Python nach Registerkarten für Sublime Text 3 suchen können
Erstellen Sie ein Python-Modul
Erstellen Sie in Python einen Dekorator, der Argumente dynamisch akzeptiert. Erstellen Sie einen Dekorator
Erstellen Sie eine Python-Umgebung
[Python] Erstellen Sie einen Linebot, der ein beliebiges Datum auf ein Foto zeichnet
Lassen Sie uns ein PRML-Diagramm mit Python, Numpy und matplotlib erstellen.
Ich habe eine verdammte App gemacht, mit der du nicht überspringen kannst
Erstellen wir eine Docker-Umgebung, in der Qiita-Trendinformationen gespeichert werden!
Erstellen Sie ein Wörterbuch in Python
Erstellen Sie ein Python-Numpy-Array
[Python / Django] Erstellen Sie eine Web-API, die im JSON-Format antwortet
[Ev3dev] Erstellen Sie ein Programm, das das LCD (Bildschirm) mit Python erfasst
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
Erstellen Sie mit tkinter eine Python-GUI
Erstellen Sie einen DI-Container mit Python
Benötigen Sie Python re.compile?
Erstellen Sie eine virtuelle Umgebung mit Python!
Erstellen Sie eine Binärdatei in Python
Python-Verzeichniserstellung Korrespondenz, wenn Verzeichnis vorhanden ist
Erstellen Sie eine Python-Umgebung in Centos
Erstellen Sie ein universelles Dekorationsframework für Python
Lassen Sie uns ein Diagramm mit Python erstellen! !!
5 Möglichkeiten zum Erstellen eines Python-Chatbots
Erstellen Sie eine zufällige Zeichenfolge in Python
Ein Hinweis, mit dem Sie die Python-Umgebung von Pineapple mit pyenv ändern können
Tipps (Kontrollstruktur), die Sie beim Programmieren von Wettbewerben mit Python2 kennen sollten
Tipps (Datenstruktur), die Sie beim Programmieren von Wettbewerben mit Python2 kennen sollten