Mam swój pakiet w pythonie i często go używam. Jaki jest najbardziej elegancki lub konwencjonalny katalog, w którym powinienem umieścić pakiet, aby został zaimportowany bez korzystania z PYTHONPATH lub sys.path?
A co na przykład z pakietami witryn?
/usr/lib/python2.7/site-packages
.
Czy w Pythonie często kopiuje się i wkleja pakiet?
python
python-2.7
Cobry
źródło
źródło
~/foo/bar/
, dodajexport PYTHONPATH=~/foo/bar # fields separated by ":"
do swojego~/.bashrc
pliku). Zobaczman python
, ta ręczna ścieżka poprzedza domyślną ścieżkę wyszukiwania w Pythonie. Uważaj na kolizje nazw.Odpowiedzi:
Zwykle umieszczam rzeczy, które chcę mieć gotowe do zaimportowania, w katalogu witryny użytkownika:
Aby pokazać właściwy katalog dla swojej platformy, możesz użyć
python -m site --user-site
edycja: pojawi się
sys.path
po utworzeniu:mkdir -p "`python -m site --user-site`"
źródło
python -m site --user-site
powie Ci, jaki katalog powinieneś utworzyć. Nie pojawi się,sys.modules
dopóki go nie utworzysz.mkdir
na,mkdir -p
aby utworzyć katalogi pośrednie. Nie miałem nawet~/.local
. ;-)Więc jeśli jesteś nowicjuszem, takim jak ja, i twoje katalogi nie są zbyt dobrze zorganizowane, możesz wypróbować tę metodę.
Otwórz terminal Pythona. Zaimportuj moduł, o którym wiesz, że działa taki jak numpy w moim przypadku i wykonaj następujące czynności.
Import numpy
numpy.__file__
Co skutkuje w
'/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages/numpy/__init__.py'
Wynikiem
numpy.__file__
jest lokalizacja, w której należy umieścić plik Pythona z modułem (z wyłączeniemnumpy/__init__.py
), więc dla mnie tak byłoby/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages
Aby to zrobić, przejdź do terminala i wpisz
mv "location of your module" "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages"
Teraz powinieneś móc zaimportować swój moduł.
źródło
re.__file__
zadziałało dla mnie.To jest coś, co działa dla mnie (muszę często tworzyć pakiety Pythona, które są przesyłane do prywatnego repozytorium pip). omówienie komentarza @jorana do pytania.
python setup.py sdist --format=tar
. utworzony pakiet powinien znajdować się wdist
folderze.pip install <yourpackage>.tar
możesz użyć,
pip install --force-reinstall
jeśli potrzebujesz więcej bawić się bibliotekami i ponownie tworzyć pakiety dist.Odkryłem, że ta metoda działa dla mnie świetnie. Jeśli nie musisz pakować modułów do używania innych systemów zamiast tylko lokalnego, ta metoda może być przesadą
Miłego hakowania.
źródło
Na moim Macu zrobiłem
sudo find / -name "site-packages"
. To dało mi kilka ścieżek, jak/Library/Python/2.6/site-packages
,/Library/Python/2.7/site-packages
i/opt/X11/lib/python2.6/site-packages
.Więc wiedziałem, gdzie umieścić moje moduły, jeśli używam wersji 2.7 lub 2.6.
Mam nadzieję, że to pomoże.
źródło
Import folderów można wyodrębnić, dodając następujący kod źródłowy:
import sys print sys.path
Przykładem automatycznego generowania linków symbolicznych byłoby:
ln -s \`pip show em | grep "Location"| cut -d " " -f2\` \`python -m site --user-site\`
zamiast "em" możesz użyć innego pakietu, który właśnie "zainstalowałeś, ale Python go nie widzi"
poniżej wyjaśnię bardziej szczegółowo, o co proszono w komentarzu.
załóżmy, że zainstalowałeś moduł Pythona em lub pyserial za pomocą następującego polecenia (przykłady dotyczą ubuntu):
a wynik wygląda tak:
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
pytanie byłoby następujące - python nie widzi pyserialu modułu, dlaczego? ponieważ lokalizacja, w której moduł został zainstalowany, nie jest tą, której Python szuka dla twojego konkretnego konta użytkownika.
rozwiązanie - musimy utworzyć dowiązanie symboliczne ze ścieżki, z której dotarł pyserial, do ścieżki, której szuka Twój python.
Polecenie tworzenia łącza symbolicznego wyglądałoby tak:
zamiast wpisywać dokładną lokalizację, prosimy pip, aby powiedział nam, gdzie przechował moduły, wykonując polecenie:
pip show pyserial | grep "Location"| cut -d " " -f2
zamiast wpisywać dokładną lokalizację, prosimy Pythona, aby powiedział nam, gdzie szuka instalowanych modułów, wykonując polecenie:
oba polecenia muszą być poprzedzone znakiem "` "(zwykle po lewej stronie przycisku 1 w przypadku klawiatur amerykańskich)
w rezultacie dla ln zostanie dostarczone następujące polecenie i zostanie utworzony brakujący link symboliczny:
ln -s /usr/local/lib/python2.7/dist-packages /home/<your_username>/.local/lib/python2.7/site-packages
lub coś podobnego, w zależności od twojej dystrybucji i domyślnych ustawień python / pip.
źródło
Jeśli tworzysz moduł, polecam to.
import sys sys.path.append("/home/mylinux/python-packages")
Teraz każdy moduł, który przechowujesz,
python-packages
może być importowany przezPython-interpreter
.źródło