ฉันจะค้นหาที่ตั้งของแหล่งโมดูล Python ได้อย่างไร


480

ฉันจะเรียนรู้ได้อย่างไรว่ามีการติดตั้งไฟล์ต้นฉบับสำหรับโมดูล Python ที่กำหนดไว้อย่างไร วิธีการนี้แตกต่างจาก Windows มากกว่าบน Linux หรือไม่?

ฉันพยายามมองหาแหล่งที่มาของdatetimeโมดูลโดยเฉพาะ แต่ฉันสนใจคำตอบทั่วไปเช่นกัน

คำตอบ:


375

themodule.__file__สำหรับโมดูลหลามบริสุทธิ์คุณสามารถหาแหล่งที่มาโดยดูที่ อย่างไรก็ตามโมดูล datetime ถูกเขียนเป็น C ดังนั้นdatetime.__file__ชี้ไปที่ไฟล์. so (ไม่มีdatetime.__file__ใน Windows) ดังนั้นคุณจะไม่เห็นแหล่งที่มา

หากคุณดาวน์โหลดทาร์บอลแหล่งไพ ธ อนและแตกไฟล์โค้ดของโมดูลสามารถพบได้ในไดเรกทอรีย่อยโมดูล

ตัวอย่างเช่นหากคุณต้องการค้นหารหัสวันที่และเวลาสำหรับ python 2.6 คุณสามารถดูได้

Python-2.6/Modules/datetimemodule.c

คุณสามารถค้นหา Mercurial เวอร์ชันล่าสุดได้จากเว็บที่ https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c


หากคุณแก้ไขคำตอบของคุณเพื่อระบุวันที่และเวลา. _ file__ ชี้ไปที่. so บน Linux & Mac OS X (แต่ใน Windows วัตถุโมดูล datetime ไม่มีแอตทริบิวต์ของไฟล์ ) ฉันจะยอมรับคำตอบของคุณ
ดาริลสปิตเซอร์

ที่จริงแล้วบน Windows (อย่างน้อยในเวอร์ชั่นที่ฉันใช้) datetime เพิ่งไม่มีไฟล์แอททริบิวต์
ดาริลสปิตเซอร์

221

การรันpython -vจากบรรทัดคำสั่งควรบอกคุณว่ากำลังนำเข้าอะไรและจากที่ไหน สิ่งนี้ใช้ได้กับฉันใน Windows และ Mac OS X

C:\>python -v
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# C:\Python24\lib\site.pyc has bad mtime
import site # from C:\Python24\lib\site.py
# wrote C:\Python24\lib\site.pyc
# C:\Python24\lib\os.pyc has bad mtime
import os # from C:\Python24\lib\os.py
# wrote C:\Python24\lib\os.pyc
import nt # builtin
# C:\Python24\lib\ntpath.pyc has bad mtime
...

ฉันไม่แน่ใจว่า mtime ที่ไม่ดีเหล่านั้นติดตั้งอยู่ที่ใด!


8
เย็น! คุณยังสามารถพิมพ์คำสั่งการนำเข้าเฉพาะของคุณเองหลังจากที่เปิดขึ้นในโหมดโต้ตอบเพื่อดูว่า lib มาจากไหน
scorpiodawg

3
built-inโมดูลอยู่ที่ไหน
loretoparisi

120

ฉันรู้ว่าคำตอบนี้เป็นเวลา 4 ปี แต่คำตอบที่มีอยู่ทำให้ผู้คนเข้าใจผิด

วิธีที่ถูกต้องในการทำเช่นนี้คือไม่เคย__file__หรือพยายามที่จะsys.pathค้นหาตัวเองและอื่น ๆ (ยกเว้นกรณีที่คุณจำเป็นต้องรองรับการใช้งานย้อนหลังเกินกว่า 2.1)

มันเป็นinspectโมดูลโดยเฉพาะอย่างยิ่งหรือgetfilegetsourcefile

ยกเว้นว่าคุณต้องการเรียนรู้และใช้กฎ (ซึ่งมีเอกสาร แต่เจ็บปวดสำหรับ CPython 2.x และไม่ได้บันทึกไว้เลยสำหรับการนำไปใช้อื่นหรือ 3.x) สำหรับการทำแผนที่.pycไปยัง.pyไฟล์ การจัดการกับแฟ้ม. zip, ไข่และโมดูลแพ็คเกจ พยายามวิธีที่แตกต่างกันเพื่อให้ได้เส้นทางไป.so/ .pydไฟล์ที่ไม่สนับสนุน__file__; การหาสิ่งที่ Jython / IronPython / PyPy ทำ; ฯลฯ ในกรณีนี้ไปได้

ในขณะเดียวกันแหล่งที่มาของ Python ทุกรุ่นจาก 2.0+ สามารถดูได้ทางออนไลน์ที่http://hg.python.org/cpython/file/X.Y/(เช่น2.7หรือ3.3 ) ดังนั้นเมื่อคุณค้นพบว่าinspect.getfile(datetime)เป็นไฟล์.soหรือ.pydไฟล์/usr/local/lib/python2.7/lib-dynload/datetime.soคุณสามารถค้นหามันได้ในไดเรกทอรี Modules การพูดอย่างเคร่งครัดไม่มีทางที่จะแน่ใจว่าไฟล์ใดที่กำหนดโมดูล แต่เกือบทั้งหมดเป็นแบบนั้นfoo.cหรือfoomodule.cดังนั้นจึงไม่ยากที่จะเดาว่าdatetimemodule.cเป็นสิ่งที่คุณต้องการ


3
เหตุใดจึง__file__ไม่สามารถใช้กับเครื่องที่ไม่ได้สร้างขึ้นภายในได้ ฉันเข้าใจว่าการรวบรวมข้อมูล sys.path สามารถเจ็บปวดได้อย่างไร (โดยเฉพาะอย่างยิ่งไม่รู้ meta_path) แต่คุณกังวลเกี่ยวกับการกำหนดเนมสเปซระหว่าง__file__คำจำกัดความและไบนารีหรือไม่

1
ฉันทำเช่นนี้ใน 2.7.8 ในวันที่และเวลาและรับ TypeError สำหรับทั้ง getfile และ getourcefile โดยส่วนตัวฉันมีงูหลามหลายรุ่นติดตั้งและฉันจำเป็นต้องรู้รุ่นของ datetimemodule.c ซึ่งชี้ไปที่เพราะตอนนี้ฉันรู้ว่ามันไม่ได้ชี้ไปที่ควรจะชี้ไปที่รุ่นล่ามที่กำลังทำงาน ...
mmitchell

1
@mmitchell: หากคุณได้รับ TypeError จาก inspect.getfile (datetime) สมมติว่า datetime เป็นโมดูลและไม่ใช่สิ่งอื่นที่คุณได้กำหนดให้กับชื่อเดียวกันฉันค่อนข้างแน่ใจว่าหมายความว่าคุณได้สร้างแบบกำหนดเองเพื่อ ลิงก์แบบสแตติกในวันที่และเวลาไปยังล่ามแทนที่จะทำให้เป็นโมดูลที่โหลดได้ แต่อาจมีเหตุผลอื่นที่ฉันไม่ได้คิด คุณต้องถามคำถามใหม่และให้ข้อมูลมากขึ้นเพื่อทำซ้ำ
abarnert

@ mmitchell: ในขณะเดียวกันไม่มีวิธีหารุ่น datetimemodule.c ที่ชี้ไปเพราะไม่ชี้ไปที่ datetimemodule.c มันชี้ไปที่โมดูลคอมไพล์ที่สร้างจากไฟล์ C นั้น ไฟล์ C อาจไม่มีอยู่ในระบบของคุณอาจได้รับการแก้ไขตั้งแต่คุณรวบรวมมัน
abarnert

@Tristan: ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณถาม แต่อาจจะตอบคำถามนี้: เมื่อใดก็ตามที่__file__ทำงานได้inspect.getfileผล; ไม่มีสถานการณ์ที่คาดเดาว่าจะใช้__file__จะดีกว่าเพียงแค่ใช้โมดูลตรวจสอบ
abarnert

67

sys.pathรายการมีรายชื่อของไดเรกทอรีที่จะค้นหาสำหรับโมดูลที่รันไทม์:

python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]

10
python -c 'import sys; print "\n".join(sys.path)'จะให้คุณดูโดยไม่ต้องไปที่หลามแบบโต้ตอบ
โจบล็อค

6
Python 3:python -c 'import sys; print("\n".join(sys.path))'
arudzinska

61

หากคุณใช้ pip เพื่อติดตั้งโมดูลของคุณเพียงแค่pip show $moduleส่งคืนตำแหน่ง


10
(ผมคิดว่า$moduleมีความหมายเป็นตัวแปรตัวยึดไม่แท้จริงสิ่งหนึ่งจะพิมพ์เช่น. m=numpy; pip show $m... ฯลฯ สำหรับการใด ๆm)
ไมเคิล

ควรทำเครื่องหมายเป็นคำตอบที่ถูกต้องที่สุดสำหรับคำถามที่ถาม
ราหุล Goyal

37

จากไลบรารีมาตรฐานลองimp.find_module

>>> import imp
>>> imp.find_module('fontTools')
(None, 'C:\\Python27\\lib\\site-packages\\FontTools\\fontTools', ('', '', 5))
>>> imp.find_module('datetime')
(None, 'datetime', ('', '', 6))

1
มันยอดเยี่ยมมาก ฉันapt-get removeDataDog และยังคงสามารถนำเข้าได้ สิ่งนี้ช่วยฉันค้นหาว่าไฟล์อยู่ที่ไหน (ดังนั้นฉันสามารถลบได้) เมื่อโซลูชันอื่นไม่ช่วย
sg

สำหรับ python3.x impแพ็คเกจเลิกใช้แล้ว (ตั้งแต่เวอร์ชั่น 3.4) สนับสนุนimportlib(ตั้งแต่ 3.1) docs.python.org/3.6/library/imp.html
michael

ตอนนี้คุณต้องใช้มันด้วยวิธีนี้สำหรับ python3 import importlibจากนั้นimportlib.util.find_spec('fontTools')
Medhat

33

datetime เป็นโมดูลในตัวดังนั้นจึงไม่มีไฟล์ต้นฉบับ (Python)

สำหรับโมดูลที่มาจาก.py(หรือ.pyc) ไฟล์คุณสามารถใช้mymodule.__file__เช่น

> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'

12

ใน python interpreter คุณสามารถนำเข้าโมดูลเฉพาะจากนั้นพิมพ์ help (module) ซึ่งจะให้รายละเอียดเช่นชื่อ, ไฟล์, โมดูลเอกสาร, คำอธิบายและอื่น ๆ

Ex:

import os

help(os)


Help on module os:

NAME

os - OS routines for Mac, NT, or Posix depending on what system we're on.

FILE

/usr/lib/python2.6/os.py

MODULE DOCS

http://docs.python.org/library/os

DESCRIPTION

This exports:

- all functions from posix, nt, os2, or ce, e.g. unlink, stat, etc.

- os.path is one of the modules posixpath, or ntpath

- os.name is 'posix', 'nt', 'os2', 'ce' or 'riscos'

et al


สิ่งนี้ทำให้ฉันเต็มเส้นทางไปยังไฟล์โมดูลในขณะที่คำตอบอื่น ๆ ให้เส้นทางญาติเท่านั้น ขอบคุณ
Jerther

12

ต่อไปนี้เป็นหนึ่งบรรทัดเพื่อรับชื่อไฟล์สำหรับโมดูลเหมาะสำหรับการทำสมนามเชลล์:

echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)'  | python - 

ตั้งค่าเป็นนามแฝง:

alias getpmpath="echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)'  | python - "

ใช้:

$ getpmpath twisted
/usr/lib64/python2.6/site-packages/twisted/__init__.pyc
$ getpmpath twisted.web
/usr/lib64/python2.6/site-packages/twisted/web/__init__.pyc


9

ลองใช้คำสั่ง nifty "cdp" นี้เพื่อ cd ไปยังไดเรกทอรีที่มีแหล่งข้อมูลสำหรับโมดูล Python ที่ระบุ:

cdp () {
  cd "$(python -c "import os.path as _, ${1}; \
    print _.dirname(_.realpath(${1}.__file__[:-1]))"
  )"
}

ขอบคุณ! มันเป็นสิ่งที่ฉันกำลังมองหา แปลกมากที่พวกเขาจะไม่รวมบางสิ่งบางอย่างไว้ใน python distro
Antony Hatchkins

9

บน windows คุณสามารถค้นหาตำแหน่งของโมดูล python ดังแสดงด้านล่าง: ie find rest_framework module ป้อนคำอธิบายรูปภาพที่นี่


4

บน Ubuntu 12.04 ตัวอย่างเช่นแพ็คเกจ numpy สำหรับ python2 สามารถดูได้ที่:

/usr/lib/python2.7/dist-packages/numpy

แน่นอนว่านี่ไม่ใช่คำตอบทั่วไป


0

โมดูลหลามทั้งหมดไม่ได้เขียนในหลาม Datetime เกิดขึ้นเป็นหนึ่งในนั้นที่ไม่ใช่และ (บน linux) คือ datetime.so

คุณจะต้องดาวน์โหลดซอร์สโค้ดไปยังไลบรารี่มาตรฐานของไพ ธ อน


2
ดาริล: คุณตอบคำตอบของจิมผิด "ดาต้าไทม์เป็นหนึ่งในโมดูลหลามที่ไม่ได้เขียนไว้ในไพ ธ อน"
Matthew Trevor

0

สำหรับผู้ที่ชื่นชอบโซลูชัน GUI: หากคุณใช้ gui เช่น Spyder (ส่วนหนึ่งของการติดตั้ง Anaconda) คุณสามารถคลิกขวาที่ชื่อโมดูล (เช่น "csv" ใน "import csv") และเลือก "go" to definition "- จะเป็นการเปิดไฟล์ แต่จะอยู่ด้านบนสุดคุณสามารถดูตำแหน่งไฟล์ที่แน่นอน (" C: .... csv.py ")


0

หากคุณไม่ได้ใช้ล่ามคุณสามารถเรียกใช้รหัสด้านล่าง:

import site
print (site.getsitepackages())

เอาท์พุท:

['C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']

องค์ประกอบที่สองใน Array จะเป็นตำแหน่งแพ็คเกจของคุณ ในกรณีนี้:

C:\Users\<your username>\AppData\Local\Programs\Python\Python37\lib\site-packages

0

อีกวิธีในการตรวจสอบว่าคุณติดตั้งงูหลามหลายรุ่นจากเทอร์มินัลหรือไม่

-MBP: ~ python3 -m pip แสดง pyperclip

ที่ตั้ง: /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-

MBP: ~ python -m pip แสดง pyperclip

ที่อยู่: /Users/umeshvuyyuru/Library/Python/2.7/lib/python/site-packages


-1

ใน IDE อย่าง Spyder ให้นำเข้าโมดูลแล้วเรียกใช้โมดูลนั้น ๆ ป้อนคำอธิบายรูปภาพที่นี่


นำเข้าและพิมพ์str()โมเดลเป็นคำอธิบายที่แม่นยำยิ่งขึ้นของสิ่งที่คุณกำลังทำในสกรีน
ช็อต

2
ยินดีต้อนรับสู่ StackOverflow! กรุณาอย่าโพสต์รหัสโดยใช้ภาพ รูปภาพอ่านยากไม่สามารถค้นหาได้และผู้อ่านบางคนไม่สามารถดูได้ โปรดใส่รหัสที่เกี่ยวข้องโดยตรงในเนื้อความของคำตอบของคุณ
ไบรอัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.