Ich habe versucht, mein eigenes Pypi-Repository zu erstellen, unter Berücksichtigung https://www.python.org/dev/peps/pep-0503/. Meine Idee war, es in ein freigegebenes Verzeichnis (ich verwende Windows), sagen host1/my-pypi
. Ich habe die index.html benötigt generiert:Pip-Installation auf einem freigegebenen Verzeichnis (Windows)
(dir) host1\my-pypi
-> (dir) toto
(file) index.html
(file) toto-1.0.0.whl
-> (file) index.html
die index.html
Dateien sehen irgendwie normal (gleiche wie in der pep-503). Ich versuche, von einem anderen Computer, sagen host2
, der Zugriff auf dieses gemeinsame Verzeichnis muss toto-Paket zu installieren mit:
pip install --index-url file://host1/my-pipy toto
aber es funktioniert nicht (wenn es die Datei mit einem OSError: [Errno 22] Invalid argument: '\\\\host1\\my-pypi\\'
zu lesen versucht).
Erstens, hat jemand das schon mal versucht (und gelöst)? (Das ist die einfache Lösung :-)).
Zweitens habe ich ein wenig im Code von pip gegraben, und es gibt ein paar Dinge, die mir unklar sind (wenn es jemals einen Profi im Pip gibt, der antworten kann ;-)).
index.py
, Methodefind_all_candidates
: es meine URL-Liste von[file://host1/my-pypi/toto]
automatisch ändert, so scheint es, dass es niehost1\my-pypi\index.html
... seltsam zu lesen versucht?index.py
, Methodeget_page
: gut Punkt 1 ist nicht für mich blockiert, wie es meine Architektur auf magische Weise passt, aber es ist eine seltsame Bedingung:# Tack index.html onto file:// URLs that point to directories (scheme, netloc, path, params, query, fragment) = \ urllib_parse.urlparse(url) if (scheme == 'file' and os.path.isdir(urllib_request.url2pathname(path))): # add trailing slash if not present so urljoin doesn't trim # final segment if not url.endswith('/'): url += '/' url = urllib_parse.urljoin(url, 'index.html') logger.debug(' file: URL is directory, getting %s', url) resp = session.get( url, headers={ "Accept": "text/html", "Cache-Control": "max-age=600", }, )
gut, wie erwartet, haben wir:
scheme = 'file' netloc = 'host1' path = '/my-pypi/'
aber die Check-Bedingung
os.path.isdir(urllib_request.url2pathname(path)))
ist offensichtlich falsch, da wir den Netzwerkstandort verworfen haben. Daher wirdindex.html
nicht an den Pfad angehängt (was sonst korrekt gewesen wäre), und daher der Fehler beim Lesen einer Datei, die nicht existiert.
Eröffnet ein Problem: https://github.com/pypa/pip/issues/4615 –