คำตอบ:
มีสองประเภทของไดเรกทอรีเว็บไซต์แพคเกจที่มีทั่วโลกและต่อผู้ใช้
ไดเรกทอรีไซต์แพ็คเกจ (" dist-packages ") ส่วนกลางแสดงอยู่ในsys.path
เมื่อคุณเรียกใช้:
python -m site
สำหรับรายการที่กระชับยิ่งขึ้นให้รันgetsitepackages
จากโมดูลไซต์ในรหัส Python:
python -c 'import site; print(site.getsitepackages())'
หมายเหตุ:ด้วย virtualenvs getsitepackages ไม่สามารถใช้ได้ , sys.path
จากข้างต้นจะแสดงรายการไดเรกทอรีเว็บไซต์แพคเกจ virtualenv ที่ถูกต้องแม้ว่า ใน Python 3 คุณสามารถใช้โมดูล sysconfigแทน:
python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
ต่อผู้ใช้เว็บไซต์ของแพคเกจไดเรกทอรี ( PEP 370 ) เป็นที่งูใหญ่ติดตั้งแพคเกจในท้องถิ่นของคุณ:
python -m site --user-site
หากสิ่งนี้ชี้ไปยังไดเร็กทอรีที่ไม่มีอยู่ให้ตรวจสอบสถานะการออกของ Python และดูpython -m site --help
คำอธิบาย
คำแนะนำ: การเรียกใช้pip list --user
หรือpip freeze --user
ให้รายการของการติดตั้งทั้งหมดสำหรับผู้ใช้แพ็คเกจไซต์
<package>.__path__
ช่วยให้คุณระบุตำแหน่งของแพคเกจเฉพาะ: ( รายละเอียด )
$ python -c "import setuptools as _; print(_.__path__)"
['/usr/lib/python2.7/dist-packages/setuptools']
<module>.__file__
ช่วยให้คุณระบุตำแหน่งของโมดูลเฉพาะ: ( ความแตกต่าง )
$ python3 -c "import os as _; print(_.__file__)"
/usr/lib/python3.6/os.py
รันpip show <package>
เพื่อแสดงข้อมูลแพ็คเกจ Debian-style:
$ pip show pytest
Name: pytest
Version: 3.8.2
Summary: pytest: simple powerful testing with Python
Home-page: https://docs.pytest.org/en/latest/
Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin and others
Author-email: None
License: MIT license
Location: /home/peter/.local/lib/python3.4/site-packages
Requires: more-itertools, atomicwrites, setuptools, attrs, pathlib2, six, py, pluggy
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
(ใช้ได้ทั้ง Python 2 และ 3 ด้วย)
python -c "import site; print(site.getsitepackages()[0])"
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
(หรือเพียงแค่รายการแรกด้วยsite.getsitepackages()[0]
)
hasattr(sys,'real_prefix')
แล้วตรวจสอบแพ็กเกจเว็บไซต์ heuristically จาก[p for p in sys.path if p.endswith('site-packages')][-1]
(บวกตรวจสอบว่ามีสิ่งหนึ่งที่พบก่อนที่จะทำ[-1]
.
ทางออกที่:
... เป็นซับเดี่ยว:
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
จัดรูปแบบเพื่อให้สามารถอ่านได้ (แทนที่จะใช้เป็นซับเดียว) ที่มีลักษณะดังนี้:
from distutils.sysconfig import get_python_lib
print(get_python_lib())
ที่มา: เอกสารคู่มือ "วิธีการติดตั้ง Django"เวอร์ชั่นเก่ามาก(แม้ว่าจะเป็นประโยชน์มากกว่าการติดตั้ง Django)
cdsitepackages
เพื่อเปลี่ยนเป็นไดเรกทอรีแพ็คเกจไซต์ของสภาพแวดล้อมโดยตรง
/usr/lib/python3/dist-packages
/usr/lib/python3.5/dist-packages
สำหรับ Ubuntu ,
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
...ไม่ถูกต้อง.
มันจะชี้ให้คุณ /usr/lib/pythonX.X/dist-packages
โฟลเดอร์นี้มีแพ็คเกจที่ระบบปฏิบัติการของคุณติดตั้งโดยอัตโนมัติเพื่อให้โปรแกรมทำงาน
บน Ubuntuจะมีโฟลเดอร์ของแพ็คเกจไซต์ที่มีแพ็คเกจที่ติดตั้งผ่าน setup_tools \ easy_install \ pip/usr/local/lib/pythonX.X/dist-packages
โฟลเดอร์ที่สองน่าจะเป็นโฟลเดอร์ที่มีประโยชน์มากกว่าถ้ากรณีการใช้เกี่ยวข้องกับการติดตั้งหรืออ่านซอร์สโค้ด
หากคุณไม่ได้ใช้ Ubuntu คุณอาจปลอดภัยที่จะคัดลอกกล่องรหัสแรกลงในเทอร์มินัล
module.__file__
เป็นวิธีที่ดีกว่า หากพวกเขากำลังพยายามติดตั้งสิ่งต่าง ๆ ... เพียงใช้เครื่องมือ
'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages()
บน Ubuntu (แม้ว่าจะไปหลังจาก /usr/local/...
ในรายการ) คุณได้รับอะไร/usr/local
ผ่านทางเท่านั้นsudo pip
และคุณไม่ควรใช้sudo pip
กับ Ubuntu เว้นแต่คุณตัดสินใจที่จะทำการแจกจ่ายเอง: ถ้าคุณใช้sudo pip
มันเป็นความรับผิดชอบของคุณเพื่อให้แน่ใจว่าการพึ่งพาทั้งหมดของโมดูลหลามปัจจุบันและอนาคตที่ติดตั้งผ่านsudo apt
หรือsudo pip
เข้ากันได้ พิจารณาว่าปัญหาใดที่virtualenv
ถูกสร้างขึ้นเพื่อแก้ปัญหา
dist-packages
in (L) Ubuntu
นี่คือสิ่งที่ได้ผลสำหรับฉัน:
python -m site --user-site
~/.local/lib/python2.7/site-packages
)
virtualenv
บ่นว่าแพคเกจไม่ได้อยู่ ฉันจะเรียกใช้แพคเกจที่ติดตั้งในตำแหน่งที่กำหนดเองได้อย่างไร
สมมติว่าคุณติดตั้งแพคเกจ 'django' แล้ว นำเข้าและพิมพ์ dir (django) มันจะแสดงให้คุณฟังก์ชั่นและคุณสมบัติทั้งหมดที่มีโมดูลนั้น พิมพ์ในหลามล่าม -
>>> import django
>>> dir(django)
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'get_version']
>>> print django.__path__
['/Library/Python/2.6/site-packages/django']
คุณสามารถทำสิ่งเดียวกันถ้าคุณติดตั้ง Mercurial
นี่คือ Snow Leopard แต่ฉันคิดว่ามันควรจะทำงานโดยทั่วไปเช่นกัน
django.__file__
__path__
และไม่ไม่รับประกันว่าจะมีอะไรเกี่ยวข้องกับแพ็คเกจเว็บไซต์ แต่ด้วยสิ่งต่าง ๆ เช่น django ที่คุณได้ติดตั้ง pipมากที่สุดมันจะทำเมื่อคุณรีบและสามารถใช้สำหรับ เพื่อวัตถุประสงค์อื่นเช่นกัน (เช่นอ่านไฟล์กำหนดค่าเริ่มต้นจากระบบไฟล์เป็นต้น)
foo.bar
แพ็คเกจของคุณ:python -c "import foo.bar as _; print(_.__path__[0])"
ดังที่คนอื่น ๆ สังเกตเห็นdistutils.sysconfig
มีการตั้งค่าที่เกี่ยวข้อง:
import distutils.sysconfig
print distutils.sysconfig.get_python_lib()
... แม้ว่าค่าเริ่มต้นsite.py
จะทำสิ่งที่ค่อนข้างหยาบมากกว่าถอดความด้านล่าง:
import sys, os
print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])
(นอกจากนี้ยังเพิ่ม${sys.prefix}/lib/site-python
และเพิ่มทั้งสองเส้นทางด้วยsys.exec_prefix
เช่นกันว่าค่าคงที่จะแตกต่างกัน)
ที่กล่าวว่าบริบทคืออะไร? คุณไม่ควรล้อเล่นกับคุณsite-packages
โดยตรง setuptools / distutils จะใช้งานได้สำหรับการติดตั้งและโปรแกรมของคุณอาจทำงานใน virtualenv ที่ pythonpath ของคุณเป็น user-local อย่างสมบูรณ์ดังนั้นจึงไม่ควรใช้แพ็คเกจไซต์ระบบโดยตรง
python2
บน osx และ ubuntu ทั้งที่มีและไม่มี virtualenv แต่ไม่มีpython3
เลย
python3
ในเรื่องที่เกี่ยวกับ
วิธี stdlib ที่ทันสมัยคือการใช้sysconfig
โมดูลที่มีอยู่ในรุ่น 2.7 และ 3.2+
หมายเหตุ : sysconfig
( แหล่งที่มา ) จะไม่สับสนกับdistutils.sysconfig
submodule ( แหล่งที่มา ) ที่กล่าวถึงในคำตอบอื่น ๆ อีกมากมายที่นี่ หลังเป็นโมดูลที่แตกต่างอย่างสิ้นเชิงและมันขาดget_paths
ฟังก์ชั่นที่กล่าวถึงด้านล่าง
Python ใช้เส้นทางแปดเส้นทาง ( เอกสาร ):
- stdlib : ไดเร็กทอรีที่มีไฟล์ไลบรารี Python มาตรฐานที่ไม่เจาะจงเฉพาะแพล็ตฟอร์ม
- platstdlib : ไดเร็กทอรีที่มีไฟล์ไลบรารี Python มาตรฐานที่ระบุเฉพาะแพล็ตฟอร์ม
- platlib : ไดเรกทอรีสำหรับไซต์เฉพาะไฟล์เฉพาะแพลตฟอร์ม
- purelib : ไดเร็กทอรีสำหรับไฟล์เฉพาะไซต์ไม่ใช่แพลตฟอร์มเฉพาะ
- รวม : ไดเร็กทอรีสำหรับไฟล์ส่วนหัวที่ไม่ใช่เฉพาะแพลตฟอร์ม
- platinclude : ไดเร็กทอรีสำหรับไฟล์ส่วนหัวเฉพาะแพล็ตฟอร์ม
- สคริปต์ : ไดเรกทอรีสำหรับไฟล์สคริปต์
- data : ไดเร็กทอรีสำหรับไฟล์ข้อมูล
ในกรณีส่วนใหญ่ผู้ใช้ที่ค้นหาคำถามนี้จะสนใจเส้นทาง 'purelib' (ในบางกรณีคุณอาจสนใจ 'platlib' ด้วย) แตกต่างจากคำตอบที่ยอมรับในปัจจุบันวิธีนี้ยังคงทำงานไม่ว่าคุณจะเปิดใช้งาน virtualenv หรือไม่ก็ตาม
ที่ระดับระบบ (นี่คือ Python 3.7.0 สำหรับ mac OS):
>>> import sysconfig
>>> sysconfig.get_paths()['purelib']
'/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages'
ด้วย venv คุณจะได้รับสิ่งนี้
>>> import sysconfig
>>> sysconfig.get_paths()['purelib']
'/private/tmp/.venv/lib/python3.7/site-packages'
เชลล์สคริปต์พร้อมใช้งานเพื่อแสดงรายละเอียดเหล่านี้ซึ่งคุณสามารถเรียกใช้ได้โดยดำเนินการsysconfig
เป็นโมดูล:
python -m sysconfig
platlib
เช่น/usr/local/lib/python3.6/site-packages
? /usr/local
ตามเนื้อผ้าสิ่งในประเทศที่มีการติดตั้งควรจะไปใน
แพ็คเกจระบบเนทีฟที่ติดตั้งด้วยการติดตั้งไพ ธ อนในระบบที่ใช้เดเบียนสามารถดูได้ที่:
/usr/lib/python2.7/dist-packages/
ใน OSX - /Library/Python/2.7/site-packages
โดยใช้รหัสขนาดเล็กนี้:
from distutils.sysconfig import get_python_lib
print get_python_lib()
อย่างไรก็ตามรายการแพ็คเกจที่ติดตั้งผ่านpip
สามารถดูได้ที่:
/ usr / local / bin /
หรืออย่างใดอย่างหนึ่งสามารถเขียนคำสั่งต่อไปนี้เพื่อแสดงรายการเส้นทางทั้งหมดที่มีแพ็คเกจของหลาม
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
หมายเหตุ: ตำแหน่งอาจแตกต่างกันไปขึ้นอยู่กับระบบปฏิบัติการของคุณเช่นใน OSX
>>> import site; site.getsitepackages()
['/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/site-python', '/Library/Python/2.7/site-packages']
site.getsitepackages()
จากการติดตั้งระบบดังนั้น dist-packages การติดตั้งอื่น ๆ จะแสดงแพ็คเกจไซต์
คำตอบทั้งหมด (หรือ: คำตอบเดียวกันซ้ำแล้วซ้ำอีก) ไม่เพียงพอ สิ่งที่คุณต้องการทำคือ:
from setuptools.command.easy_install import easy_install
class easy_install_default(easy_install):
""" class easy_install had problems with the fist parameter not being
an instance of Distribution, even though it was. This is due to
some import-related mess.
"""
def __init__(self):
from distutils.dist import Distribution
dist = Distribution()
self.distribution = dist
self.initialize_options()
self._dry_run = None
self.verbose = dist.verbose
self.force = None
self.help = 0
self.finalized = 0
e = easy_install_default()
import distutils.errors
try:
e.finalize_options()
except distutils.errors.DistutilsError:
pass
print e.install_dir
บรรทัดสุดท้ายแสดงให้เห็นถึงการติดตั้ง dir ใช้งานกับ Ubuntu ได้ แต่ไม่สามารถใช้งานได้ อย่าถามฉันเกี่ยวกับ windows หรือ dists อื่น ๆ แต่เนื่องจากเป็น dir ที่แน่นอนเหมือนกับที่ easy_install ใช้เป็นค่าเริ่มต้นจึงอาจถูกต้องทุกที่ที่ easy_install ทำงาน (ดังนั้นทุกที่หรือแม้แต่ mac) มีความสุข. หมายเหตุ: รหัสดั้งเดิมมีคำสัตย์สาบานมากมาย
easy_install
และไม่ได้ล้มเหลวอย่างสง่างามถ้าไม่พร้อมใช้งานซึ่งไม่เพียงพอ :)
หมายเหตุด้านข้าง: โซลูชันที่นำเสนอ ( distutils.sysconfig.get_python_lib()
) ไม่ทำงานเมื่อมีไดเรกทอรีแพ็คเกจไซต์มากกว่าหนึ่งไดเรกทอรี (ตามที่แนะนำโดยบทความนี้ ) มันจะกลับไดเรกทอรีไดเรกทอรีแพคเกจหลักเท่านั้น
อนิจจาฉันไม่มีทางออกที่ดีกว่าอย่างใดอย่างหนึ่ง Python ดูเหมือนจะไม่ติดตามไดเรกทอรีแพ็คเกจเว็บไซต์เพียงแค่แพ็คเกจภายใน
get_python_lib()
เมื่อมีการเรียกใช้จากภายใน virtualenv แสดงเว็บไซต์แพคเกจของงูใหญ่ใช้ในการสร้าง virtualenv และไม่ virtualenv ของเว็บไซต์แพคเกจ
มันใช้งานได้สำหรับฉัน มันจะช่วยให้คุณได้รับแพคเกจ dist และโฟลเดอร์แพ็คเกจเว็บไซต์ หากโฟลเดอร์ไม่ได้อยู่ในเส้นทางของงูหลามมันจะไม่ทำให้คุณดีเท่าไหร่
import sys;
print [f for f in sys.path if f.endswith('packages')]
เอาต์พุต (การติดตั้ง Ubuntu):
['/home/username/.local/lib/python2.7/site-packages',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages']
สิ่งนี้ควรทำงานกับการกระจายในและนอกสภาพแวดล้อมเสมือนทั้งหมดเนื่องจากเป็น "เทคโนโลยีขั้นต่ำ" โมดูลระบบปฏิบัติการจะอยู่ในไดเรกทอรีหลักของ 'site-packages'
import os; print(os.path.dirname(os.__file__) + '/site-packages')
ในการเปลี่ยน dir เป็น site-packages dir ฉันใช้นามแฝงต่อไปนี้ (บนระบบ * nix):
alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
หมายเหตุเพิ่มเติมสำหรับget_python_lib
ฟังก์ชั่นที่กล่าวถึงแล้ว: ในบางแพลตฟอร์มจะใช้ไดเรกทอรีที่แตกต่างกันสำหรับโมดูลเฉพาะแพลตฟอร์ม (เช่น: โมดูลที่ต้องมีการรวบรวม) หากคุณผ่านplat_specific=True
ไปยังฟังก์ชั่นคุณจะได้รับแพ็คเกจเว็บไซต์สำหรับแพ็คเกจเฉพาะแพลตฟอร์ม
from distutils.sysconfig import get_python_lib
print get_python_lib()
pip pip จะให้รายละเอียดทั้งหมดเกี่ยวกับแพ็คเกจ: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show] [1]
วิธีรับตำแหน่ง:
pip show <package_name>| grep Location
ตอบคำถามเก่า ๆ แต่ใช้ ipython สำหรับสิ่งนี้
pip install ipython
ipython
import imaplib
imaplib?
นี้จะให้ผลลัพธ์ต่อไปนี้เกี่ยวกับแพคเกจ imaplib -
Type: module
String form: <module 'imaplib' from '/usr/lib/python2.7/imaplib.py'>
File: /usr/lib/python2.7/imaplib.py
Docstring:
IMAP4 client.
Based on RFC 2060.
Public class: IMAP4
Public variable: Debug
Public functions: Internaldate2tuple
Int2AP
ParseFlags
Time2Internaldate
คุณควรลองใช้คำสั่งนี้เพื่อกำหนดตำแหน่งการติดตั้งของ pip
Python 2
pip show six | grep "Location:" | cut -d " " -f2
Python 3
pip3 show six | grep "Location:" | cut -d " " -f2
ผมต้องทำอะไรบางอย่างที่แตกต่างกันเล็กน้อยสำหรับโครงการที่ผมได้ทำงานใน: หาญาติเว็บไซต์แพคเกจไดเรกทอรีเทียบกับฐานติดตั้งคำนำหน้า หากโฟลเดอร์แพ็คเกจไซต์อยู่ใน/usr/lib/python2.7/site-packages
ฉันต้องการ/lib/python2.7/site-packages
ส่วนนั้น ในความเป็นจริงฉันมีระบบที่พบsite-packages
ใน/usr/lib64
และคำตอบที่ยอมรับไม่ได้ทำงานกับระบบเหล่านั้น
คล้ายกับคำตอบของสิบแปดมงกุฎวิธีแก้ปัญหาของฉันมองลึกเข้าไปในความกล้าหาญของ Distutils เพื่อค้นหาเส้นทางที่ผ่านเข้ามาในความsetup.py
จริง มันเป็นความเจ็บปวดที่จะคิดออกว่าฉันไม่ต้องการให้ใครได้คิดอีกครั้ง
import sys
import os
from distutils.command.install import INSTALL_SCHEMES
if os.name == 'nt':
scheme_key = 'nt'
else:
scheme_key = 'unix_prefix'
print(INSTALL_SCHEMES[scheme_key]['purelib'].replace('$py_version_short', (str.split(sys.version))[0][0:3]).replace('$base', ''))
ว่าควรพิมพ์สิ่งที่ต้องการหรือ/Lib/site-packages
/lib/python3.6/site-packages
ถ้ามันถูกเพิ่มไปที่PYTHONPATH
คุณสามารถทำสิ่งที่ชอบ
import sys
print('\n'.join(sys.path))
pip show <package name>