ฉันจะหาที่ตั้งของไดเรกทอรี Python site-packages ของฉันได้อย่างไร


941

ฉันจะค้นหาตำแหน่งที่ตั้งของไดเรกทอรีไซต์แพ็คเกจของฉันได้อย่างไร


63
หากคุณต้องการตำแหน่งที่แน่นอนของหนึ่งแพคเกจคุณสามารถใช้pip show <package name>
joshuakcockrell

คำตอบ:


530

มีสองประเภทของไดเรกทอรีเว็บไซต์แพคเกจที่มีทั่วโลกและต่อผู้ใช้

  1. ไดเรกทอรีไซต์แพ็คเกจ (" 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"])'
  2. ต่อผู้ใช้เว็บไซต์ของแพคเกจไดเรกทอรี ( 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

17
มีไดเรกทอรีแพ็คเกจไซต์ใน virtualenv คุณสามารถรับไดเรกทอรีสำหรับโมดูลเฉพาะไซต์ภายใน / ภายนอก virtualenv โดยใช้python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"(ใช้ได้ทั้ง Python 2 และ 3 ด้วย)
jfs

4
ดี และเพื่อให้ได้คนแรก:python -c "import site; print(site.getsitepackages()[0])"
Brent Faust

2
นี่ควรเป็นบทแนะนำพื้นฐานเกี่ยวกับการใช้งาน python ฉัน pythoning มาหลายปีแล้วและไม่รู้เกี่ยวกับโมดูลไซต์ จะได้บันทึกไว้ปวดหัวมากดังนั้น ...
salotz

1
ฉันได้แนะนำการเปลี่ยนแปลงการสอนอย่างเป็นทางการของ Python โปรดดูรายละเอียดPR # 16974และขอขอบคุณสำหรับข้อเสนอแนะ @salotz!
Peterino

1
ฉันคิดว่าstackoverflow.com/a/52638888/1365918เป็นคำตอบที่ดีที่สุดสำหรับคำถามนี้อย่างง่ายดาย
kapad

652
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

(หรือเพียงแค่รายการแรกด้วยsite.getsitepackages()[0])


17
นี่เป็นสิ่งที่ดี แต่น่าเสียดายที่ฟังก์ชั่นนี้ใช้ได้เฉพาะจาก python2.7 เท่านั้น ดังนั้นทางออกที่ดีถ้าคุณใช้ python2.7 หรือสูงกว่า แต่ไม่ได้ทำงานกับ python 2.6 และต่ำกว่า
Dan Niero

15
python -c "ไซต์นำเข้าพิมพ์ (site.getsitepackages ())"
Lars Schneider

29
ฉันได้รับ AttributeError: วัตถุ 'โมดูล' ไม่มีแอตทริบิวต์ 'getitepackages' เมื่อใช้กับ virtualenv (python 2.7.8) โซลูชัน distutils ด้านล่างใช้งานได้
radtek

8
@radtek: สำหรับ venv ผมตรวจสอบ venv ผ่านhasattr(sys,'real_prefix')แล้วตรวจสอบแพ็กเกจเว็บไซต์ heuristically จาก[p for p in sys.path if p.endswith('site-packages')][-1](บวกตรวจสอบว่ามีสิ่งหนึ่งที่พบก่อนที่จะทำ[-1].
eudoxos

4
@radtek มันเป็นข้อผิดพลาดที่รู้จักกันว่าโมดูลเว็บไซต์ไม่ทำงานสำหรับ virtualenv github.com/pypa/virtualenv/issues/355
Guillem Cucurull

319

ทางออกที่:

  • ด้านนอกของ virtualenv - มอบเส้นทางของแพ็คเกจไซต์ทั่วโลก
  • insidue a virtualenv - จัดเตรียมแพ็กเกจไซต์virtualenv

... เป็นซับเดี่ยว:

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)


1
virtualenv มีวิธีในการค้นหาแพ็คเกจไซต์หรือไม่
ดาริลสปิตเซอร์

10
คุณสามารถใช้ virtualenvwrapper ซึ่งมีคำสั่งcdsitepackagesเพื่อเปลี่ยนเป็นไดเรกทอรีแพ็คเกจไซต์ของสภาพแวดล้อมโดยตรง
john2x

6
@PiotrDobrogost: ทำงานกับฉันใน Python 2.7 ใน virtualenv บน Linux
RichVel

2
ความคิดเห็นแรกใช้ไม่ได้อีกต่อไป: สิ่งนี้แสดงตำแหน่งที่ถูกต้องทั้งภายนอกและภายใน virtualenv
astrojuanlu

2
ไม่ได้ทำงานสำหรับฉันบน Windows 10 ใช้ Linux ทุบตีก็จะส่งกลับแทน/usr/lib/python3/dist-packages /usr/lib/python3.5/dist-packages
Delgan

99

สำหรับ 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 คุณอาจปลอดภัยที่จะคัดลอกกล่องรหัสแรกลงในเทอร์มินัล


3
หากผู้ถามอยู่หลังแพ็คเกจของสถานที่แพคเกจmodule.__file__เป็นวิธีที่ดีกว่า หากพวกเขากำลังพยายามติดตั้งสิ่งต่าง ๆ ... เพียงใช้เครื่องมือ
Tobu

'/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ถูกสร้างขึ้นเพื่อแก้ปัญหา
jfs

คำอธิบายที่ชัดเจนเพื่อทำความเข้าใจความแตกต่างของ 2 dist-packagesin (L) Ubuntu
Timo

69

นี่คือสิ่งที่ได้ผลสำหรับฉัน:

python -m site --user-site

15
สำหรับฉันแล้วสิ่งนี้ชี้ไปยังโฟลเดอร์ที่ไม่มีอยู่ ( ~/.local/lib/python2.7/site-packages)
Neil Traft

1
เหมือนกันใน OS X Mavericks บ้านของฉัน. local ไม่ใช่สิ่งที่ฉันต้องการให้มันค้นหาและใช่มันไม่ได้อยู่ที่นั่นจริงๆ
radtek

ในหลัก / ห้องสมุดของฉันโฟลเดอร์ผมต้องด้วยตนเองนำทางไปด้วยเหตุผลบางเส้นทางแบบเต็มโดยตรงไม่ได้ทำงาน
efwjames

ฉันจะใช้แพ็คเกจที่ติดตั้งที่นี่ได้อย่างไร ถ้าฉันจะvirtualenvบ่นว่าแพคเกจไม่ได้อยู่ ฉันจะเรียกใช้แพคเกจที่ติดตั้งในตำแหน่งที่กำหนดเองได้อย่างไร
AbtPst

2
นี่เป็นการบอกคุณว่า Python จะค้นหาแพ็คเกจเฉพาะของผู้ใช้ที่ไหน ความคิดเห็นเช่น "ไม่มีอยู่จริง" และ "ไม่ใช่สิ่งที่ฉันต้องการให้ค้นหา" ไม่สมเหตุสมผลในบริบทนี้
Abe ซื่อสัตย์

28

สมมติว่าคุณติดตั้งแพคเกจ '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 แต่ฉันคิดว่ามันควรจะทำงานโดยทั่วไปเช่นกัน


>>> import pg >>> print pg .__ path__ Traceback (การโทรล่าสุดครั้งล่าสุด): ไฟล์ "<stdin>", บรรทัดที่ 1 ใน <module> AttributeError: 'โมดูล' วัตถุไม่มีแอตทริบิวต์ ' เส้นทาง '
Dannid

ใช้งานได้ฉันต้องค้นหาแพ็คเกจ sklearn เพื่อเพิ่มไปยังเส้นทาง PYDEV ขอบคุณ
berkay

ใช้สำหรับการนี้มากกว่าdjango.__file__ __path__และไม่ไม่รับประกันว่าจะมีอะไรเกี่ยวข้องกับแพ็คเกจเว็บไซต์ แต่ด้วยสิ่งต่าง ๆ เช่น django ที่คุณได้ติดตั้ง pipมากที่สุดมันจะทำเมื่อคุณรีบและสามารถใช้สำหรับ เพื่อวัตถุประสงค์อื่นเช่นกัน (เช่นอ่านไฟล์กำหนดค่าเริ่มต้นจากระบบไฟล์เป็นต้น)
JL Peyret

จากคำตอบนี้และคำตอบอื่น ๆ คุณสามารถทำได้ในหนึ่งบรรทัดจากบรรทัดคำสั่งเพื่อรับเส้นทางไปยังfoo.barแพ็คเกจของคุณ:python -c "import foo.bar as _; print(_.__path__[0])"
snark

23

ดังที่คนอื่น ๆ สังเกตเห็น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 อย่างสมบูรณ์ดังนั้นจึงไม่ควรใช้แพ็คเกจไซต์ระบบโดยตรง


3
ทำงานได้อย่างน่าเชื่อถือด้วยpython2บน osx และ ubuntu ทั้งที่มีและไม่มี virtualenv แต่ไม่มีpython3เลย
กระวนกระวายใจ

2
ปี 2008 เป็นช่วงเวลาที่ผ่านมา - คำตอบนี้คือสามเดือนก่อนที่ Python 3.0 จะวางจำหน่าย
Charles Duffy

แน่นอน แต่วันนี้ความคิดเห็นของฉันอาจช่วยได้ แก้ไขให้ฉันถ้าฉันผิด นอกจากนี้ฉันไม่ downvote คำตอบนี้หรืออื่น ๆ python3ในเรื่องที่เกี่ยวกับ
กระวนกระวายใจ

22

วิธี stdlib ที่ทันสมัยคือการใช้sysconfigโมดูลที่มีอยู่ในรุ่น 2.7 และ 3.2+

หมายเหตุ : sysconfig( แหล่งที่มา ) จะไม่สับสนกับdistutils.sysconfigsubmodule ( แหล่งที่มา ) ที่กล่าวถึงในคำตอบอื่น ๆ อีกมากมายที่นี่ หลังเป็นโมดูลที่แตกต่างอย่างสิ้นเชิงและมันขาด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

นี่คือคำตอบที่ดีฉันมีความสุขโมดูล sysconfig ใหม่ทำให้สิ่งนี้ง่ายขึ้น มีวิธีที่จะได้รับคำนำหน้าท้องถิ่นplatlibเช่น/usr/local/lib/python3.6/site-packages? /usr/localตามเนื้อผ้าสิ่งในประเทศที่มีการติดตั้งควรจะไปใน
eudoxos

คำตอบที่ดีที่สุดสำหรับคำถามนี้ได้อย่างง่ายดาย! ขอบคุณ. สิ่งเดียวที่ฉันพบที่ขาดหายไปคือการสั่งซื้อที่จะตรวจสอบสถานที่เหล่านี้เมื่อพบคำสั่งนำเข้า นอกจากนี้ยังมีตำแหน่งใด ๆ ที่ค้นหาล่วงหน้า / แคชเมื่อโหลดไพ ธ อนด้วย รู้ว่าจะเป็นประโยชน์ IMO
kapad

21

แพ็คเกจระบบเนทีฟที่ติดตั้งด้วยการติดตั้งไพ ธ อนในระบบที่ใช้เดเบียนสามารถดูได้ที่:

/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']

ถ้าฉันจำได้อย่างถูกต้อง dist-packages เฉพาะ Debian และ derivates
ซามูเอล

1
@SamuelSantana คุณถูกต้อง dist-packages เป็นระบบเฉพาะสำหรับเดเบียน ในกรณีนี้ฉันเรียกใช้site.getsitepackages()จากการติดตั้งระบบดังนั้น dist-packages การติดตั้งอื่น ๆ จะแสดงแพ็คเกจไซต์
fnatic_shank

15

คำตอบทั้งหมด (หรือ: คำตอบเดียวกันซ้ำแล้วซ้ำอีก) ไม่เพียงพอ สิ่งที่คุณต้องการทำคือ:

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) มีความสุข. หมายเหตุ: รหัสดั้งเดิมมีคำสัตย์สาบานมากมาย


1
ขอบคุณสิ่งนี้มีประโยชน์มากใน py3 ที่มีเครื่องหมายวงเล็บสำหรับพิมพ์มันทำให้ฉัน / usr/local/lib/python3.4/dist-packages ฉันพยายามหาวิธีใช้ /usr/lib/python3.4/dist แพคเกจดังนั้นจะต้องเล่นต่อไป
Stuart Axon

4
ต้องใช้ห้องสมุดภายนอกeasy_installและไม่ได้ล้มเหลวอย่างสง่างามถ้าไม่พร้อมใช้งานซึ่งไม่เพียงพอ :)
กระวนกระวายใจ

1
จริง ๆ แล้วมันไม่สมบูรณ์แบบ แต่มันใช้งานได้สำหรับฉันและใช้เวลาในการคิดอย่างมากดังนั้นฉันจึงวางมันไว้ที่นี่โดยหวังว่าจะมีคนอื่นสามารถสร้างได้ตามเวลาที่ฉันใช้ไป
สิบแปดมงกุฎ

13

หมายเหตุด้านข้าง: โซลูชันที่นำเสนอ ( distutils.sysconfig.get_python_lib()) ไม่ทำงานเมื่อมีไดเรกทอรีแพ็คเกจไซต์มากกว่าหนึ่งไดเรกทอรี (ตามที่แนะนำโดยบทความนี้ ) มันจะกลับไดเรกทอรีไดเรกทอรีแพคเกจหลักเท่านั้น

อนิจจาฉันไม่มีทางออกที่ดีกว่าอย่างใดอย่างหนึ่ง Python ดูเหมือนจะไม่ติดตามไดเรกทอรีแพ็คเกจเว็บไซต์เพียงแค่แพ็คเกจภายใน


1
ฉันเดาว่าเป็นเหตุผลว่าทำไมget_python_lib()เมื่อมีการเรียกใช้จากภายใน virtualenv แสดงเว็บไซต์แพคเกจของงูใหญ่ใช้ในการสร้าง virtualenv และไม่ virtualenv ของเว็บไซต์แพคเกจ
Piotr Dobrogost

3
@Piotr นั่นอาจเป็นข้อผิดพลาดใน distutils.sysconfig ฉันเพิ่งทดสอบว่าจะได้รับแพ็คเกจเว็บไซต์ภายในตามที่คาดไว้
Tobu

ทดสอบด้วย Python 2.7 ที่ติดตั้งใน virtualenv บน Linux และวิธีการ distutils.sysconfig ทำงานได้ดีเพื่อรับแพคเกจไซต์ Python ภายใน
RichVel

12

มันใช้งานได้สำหรับฉัน มันจะช่วยให้คุณได้รับแพคเกจ 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']

2
คำตอบที่ได้รับการยอมรับเป็นวิธีที่แนะนำดังนั้นคุณควรบอกว่าทำไมคุณถึงดีกว่าเพราะมันค่อนข้างแฮ็ค
CharlesB

แฮ็คมีอะไรผิดปกติ? ;) มันง่ายและเข้าใจง่ายและจดจำได้ถ้าคุณทำงานแบบโต้ตอบ
just_an_old_guy

11

สิ่งนี้ควรทำงานกับการกระจายในและนอกสภาพแวดล้อมเสมือนทั้งหมดเนื่องจากเป็น "เทคโนโลยีขั้นต่ำ" โมดูลระบบปฏิบัติการจะอยู่ในไดเรกทอรีหลักของ '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'

10

หมายเหตุเพิ่มเติมสำหรับget_python_libฟังก์ชั่นที่กล่าวถึงแล้ว: ในบางแพลตฟอร์มจะใช้ไดเรกทอรีที่แตกต่างกันสำหรับโมดูลเฉพาะแพลตฟอร์ม (เช่น: โมดูลที่ต้องมีการรวบรวม) หากคุณผ่านplat_specific=Trueไปยังฟังก์ชั่นคุณจะได้รับแพ็คเกจเว็บไซต์สำหรับแพ็คเกจเฉพาะแพลตฟอร์ม




3

ตอบคำถามเก่า ๆ แต่ใช้ 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

1
นี่ไม่ใช่ไดเรกทอรีไซต์แพ็กเกจ แต่ไดเร็กทอรีที่ติดตั้งแพ็กเกจไว้ สิ่งนี้จะมีประโยชน์ก็ต่อเมื่อคุณใช้ iPython และไม่สามารถรับไดเรกทอรีการติดตั้งโดยทางโปรแกรม
danielunderwood

3

คุณควรลองใช้คำสั่งนี้เพื่อกำหนดตำแหน่งการติดตั้งของ pip

Python 2

pip show six | grep "Location:" | cut -d " " -f2

Python 3

pip3 show six | grep "Location:" | cut -d " " -f2

1

ผมต้องทำอะไรบางอย่างที่แตกต่างกันเล็กน้อยสำหรับโครงการที่ผมได้ทำงานใน: หาญาติเว็บไซต์แพคเกจไดเรกทอรีเทียบกับฐานติดตั้งคำนำหน้า หากโฟลเดอร์แพ็คเกจไซต์อยู่ใน/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


-2

ถ้ามันถูกเพิ่มไปที่PYTHONPATHคุณสามารถทำสิ่งที่ชอบ

import sys
print('\n'.join(sys.path))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.