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. ** ** **
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.
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.
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.
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.
version
auf 1.1find_packages
hinzu und fügen Sie packages = find_packages ()
hinzuentry_points
hinzu. Das Format wird mit "Befehlsname = Modul: Methode" geschriebensetup.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.
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
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.
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.
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.
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.
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/
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.