Ich habe mein eigenes Paket in Python und benutze es sehr oft. Was ist das eleganteste oder konventionellste Verzeichnis, in das ich mein Paket legen sollte, damit es importiert wird, ohne mit PYTHONPATH oder sys.path zu spielen?
Was ist zum Beispiel mit Site-Paketen?
/usr/lib/python2.7/site-packages
.
Ist es in Python üblich, das Paket dort zu kopieren und einzufügen?
python
python-2.7
Cobry
quelle
quelle
~/foo/bar/
,export PYTHONPATH=~/foo/bar # fields separated by ":"
zu Ihrer~/.bashrc
Datei hinzufügen ). Sieheman python
dieses Handbuch Pfad geht der Standard - Python - Suchpfad. Vorsicht vor Namenskollisionen.Antworten:
Normalerweise lege ich das zu importierende Material in das Benutzer-Site-Verzeichnis:
Um das richtige Verzeichnis für Ihre Plattform anzuzeigen, können Sie verwenden
python -m site --user-site
Bearbeiten: Es wird angezeigt,
sys.path
sobald Sie es erstellt haben:mkdir -p "`python -m site --user-site`"
quelle
python -m site --user-site
Ihnen mit, welches Verzeichnis Sie erstellen sollen. Es wird erst angezeigt,sys.modules
wenn Sie es tatsächlich erstellt haben.mkdir
ummkdir -p
die Zwischenverzeichnisse zu erstellen. Ich hatte nicht einmal eine~/.local
. ;-)Wenn Sie ein Anfänger wie ich und Ihre Verzeichnisse nicht sehr gut organisiert sind, können Sie diese Methode ausprobieren.
Öffnen Sie Ihr Python-Terminal. Importieren Sie ein Modul, von dem Sie wissen, dass es in meinem Fall wie numpy funktioniert, und führen Sie die folgenden Schritte aus.
Import numpy
numpy.__file__
was in ... endet
'/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages/numpy/__init__.py'
Das Ergebnis von
numpy.__file__
ist der Speicherort, an dem Sie die Python-Datei mit Ihrem Modul (mit Ausnahme desnumpy/__init__.py
) ablegen sollten/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages
Gehen Sie dazu einfach zu Ihrem Terminal und geben Sie ein
mv "location of your module" "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages"
Jetzt sollten Sie Ihr Modul importieren können.
quelle
re.__file__
hat bei mir funktioniert.Dies funktioniert bei mir (ich muss häufig Python-Pakete erstellen, die in ein privates Pip-Repository hochgeladen werden). Ausarbeitung des Kommentars von @joran zu der Frage.
python setup.py sdist --format=tar
. Das erstellte Paket sollte sich idealerweise imdist
Ordner befinden.pip install <yourpackage>.tar
Sie können verwenden,
pip install --force-reinstall
wenn Sie mehr mit den Bibliotheken herumspielen und die dist-Pakete neu erstellen müssen.Ich habe festgestellt, dass diese Methode für mich gut funktioniert. Wenn Sie die Module nicht für die Verwendung anderer Systeme anstatt nur Ihrer lokalen Systeme verpacken müssen, ist diese Methode möglicherweise ein Overkill
Viel Spaß beim Hacken.
quelle
Auf meinem Mac habe ich eine
sudo find / -name "site-packages"
. Das gab mir ein paar Wege , wie/Library/Python/2.6/site-packages
,/Library/Python/2.7/site-packages
und/opt/X11/lib/python2.6/site-packages
.Ich wusste also, wo ich meine Module platzieren sollte, wenn ich v2.7 oder v2.6 verwendete.
Ich hoffe es hilft.
quelle
Importordner können durch Hinzufügen des folgenden Quellcodes extrahiert werden:
import sys print sys.path
Beispiel für eine automatische Symlink-Generierung wäre:
ln -s \`pip show em | grep "Location"| cut -d " " -f2\` \`python -m site --user-site\`
Anstelle von "em" können Sie auch ein anderes Paket verwenden, das Sie "gerade installiert haben, aber der Python kann es nicht sehen".
Im Folgenden werde ich näher erläutern, wie im Kommentar angefordert.
Angenommen, Sie haben das Python-Modul em oder pyserial mit dem folgenden Befehl installiert (Beispiele für Ubuntu):
und die Ausgabe ist wie folgt:
Collecting pyserial Downloading pyserial-3.3-py2.py3-none-any.whl (189kB) 100% |████████████████████████████████| 194kB 2.3MB/s Installing collected packages: pyserial Successfully installed pyserial-3.3
Die Frage wäre folgende: Python kann das Modul pyserial nicht sehen, warum? da der Speicherort, an dem das Modul installiert wurde, nicht derjenige ist, nach dem Python für Ihr bestimmtes Benutzerkonto sucht.
Lösung - Wir müssen einen Symlink von dem Pfad, auf dem Pyserial angekommen ist, zu dem Pfad erstellen, nach dem Ihre Python sucht.
Der Befehl zum Erstellen eines Symlinks wäre:
Anstatt den genauen Speicherort einzugeben, bitten wir pip, uns durch Ausführen des folgenden Befehls mitzuteilen, wo die Module gespeichert sind:
pip show pyserial | grep "Location"| cut -d " " -f2
Anstatt den genauen Speicherort einzugeben, bitten wir Python, uns mitzuteilen, wo nach den zu installierenden Modulen gesucht wird, indem der Befehl ausgeführt wird:
Beide Befehle müssen mit dem Zeichen "` "maskiert werden (normalerweise links von Ihrer 1-Taste für die US-Tastaturen).
Im Ergebnis wird der folgende Befehl für ln bereitgestellt und der fehlende Symlink wird erstellt:
ln -s /usr/local/lib/python2.7/dist-packages /home/<your_username>/.local/lib/python2.7/site-packages
oder ähnliches, abhängig von Ihren Standardeinstellungen für Distribution und Python / Pip.
quelle
Wenn Sie ein Modul entwickeln, würde ich empfehlen, dies zu befolgen.
import sys sys.path.append("/home/mylinux/python-packages")
Jetzt kann jedes Modul, in dem Sie sich
python-packages
befinden, von importiert werdenPython-interpreter
.quelle