ฉันจะเรียนรู้ได้อย่างไรว่ามีการติดตั้งไฟล์ต้นฉบับสำหรับโมดูล Python ที่กำหนดไว้อย่างไร วิธีการนี้แตกต่างจาก Windows มากกว่าบน Linux หรือไม่?
ฉันพยายามมองหาแหล่งที่มาของdatetime
โมดูลโดยเฉพาะ แต่ฉันสนใจคำตอบทั่วไปเช่นกัน
ฉันจะเรียนรู้ได้อย่างไรว่ามีการติดตั้งไฟล์ต้นฉบับสำหรับโมดูล Python ที่กำหนดไว้อย่างไร วิธีการนี้แตกต่างจาก Windows มากกว่าบน Linux หรือไม่?
ฉันพยายามมองหาแหล่งที่มาของdatetime
โมดูลโดยเฉพาะ แต่ฉันสนใจคำตอบทั่วไปเช่นกัน
คำตอบ:
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
การรัน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 ที่ไม่ดีเหล่านั้นติดตั้งอยู่ที่ใด!
built-in
โมดูลอยู่ที่ไหน
ฉันรู้ว่าคำตอบนี้เป็นเวลา 4 ปี แต่คำตอบที่มีอยู่ทำให้ผู้คนเข้าใจผิด
วิธีที่ถูกต้องในการทำเช่นนี้คือไม่เคย__file__
หรือพยายามที่จะsys.path
ค้นหาตัวเองและอื่น ๆ (ยกเว้นกรณีที่คุณจำเป็นต้องรองรับการใช้งานย้อนหลังเกินกว่า 2.1)
มันเป็นinspect
โมดูลโดยเฉพาะอย่างยิ่งหรือgetfile
getsourcefile
ยกเว้นว่าคุณต้องการเรียนรู้และใช้กฎ (ซึ่งมีเอกสาร แต่เจ็บปวดสำหรับ 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เป็นสิ่งที่คุณต้องการ
__file__
ไม่สามารถใช้กับเครื่องที่ไม่ได้สร้างขึ้นภายในได้ ฉันเข้าใจว่าการรวบรวมข้อมูล sys.path สามารถเจ็บปวดได้อย่างไร (โดยเฉพาะอย่างยิ่งไม่รู้ meta_path) แต่คุณกังวลเกี่ยวกับการกำหนดเนมสเปซระหว่าง__file__
คำจำกัดความและไบนารีหรือไม่
__file__
ทำงานได้inspect.getfile
ผล; ไม่มีสถานการณ์ที่คาดเดาว่าจะใช้__file__
จะดีกว่าเพียงแค่ใช้โมดูลตรวจสอบ
sys.path
รายการมีรายชื่อของไดเรกทอรีที่จะค้นหาสำหรับโมดูลที่รันไทม์:
python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
python -c 'import sys; print "\n".join(sys.path)'
จะให้คุณดูโดยไม่ต้องไปที่หลามแบบโต้ตอบ
python -c 'import sys; print("\n".join(sys.path))'
หากคุณใช้ pip เพื่อติดตั้งโมดูลของคุณเพียงแค่pip show $module
ส่งคืนตำแหน่ง
$module
มีความหมายเป็นตัวแปรตัวยึดไม่แท้จริงสิ่งหนึ่งจะพิมพ์เช่น. m=numpy; pip show $m
... ฯลฯ สำหรับการใด ๆm
)
จากไลบรารีมาตรฐานลอง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))
apt-get remove
DataDog และยังคงสามารถนำเข้าได้ สิ่งนี้ช่วยฉันค้นหาว่าไฟล์อยู่ที่ไหน (ดังนั้นฉันสามารถลบได้) เมื่อโซลูชันอื่นไม่ช่วย
imp
แพ็คเกจเลิกใช้แล้ว (ตั้งแต่เวอร์ชั่น 3.4) สนับสนุนimportlib
(ตั้งแต่ 3.1) docs.python.org/3.6/library/imp.html
import importlib
จากนั้นimportlib.util.find_spec('fontTools')
datetime
เป็นโมดูลในตัวดังนั้นจึงไม่มีไฟล์ต้นฉบับ (Python)
สำหรับโมดูลที่มาจาก.py
(หรือ.pyc
) ไฟล์คุณสามารถใช้mymodule.__file__
เช่น
> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
ใน 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
ต่อไปนี้เป็นหนึ่งบรรทัดเพื่อรับชื่อไฟล์สำหรับโมดูลเหมาะสำหรับการทำสมนามเชลล์:
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
ใหม่ใน Python 3.2 ตอนนี้คุณสามารถใช้เช่นcode_info()
จากโมดูล dis:
http://docs.python.org/dev/whatsnew/3.2.html#dis
ลองใช้คำสั่ง nifty "cdp" นี้เพื่อ cd ไปยังไดเรกทอรีที่มีแหล่งข้อมูลสำหรับโมดูล Python ที่ระบุ:
cdp () {
cd "$(python -c "import os.path as _, ${1}; \
print _.dirname(_.realpath(${1}.__file__[:-1]))"
)"
}
บน windows คุณสามารถค้นหาตำแหน่งของโมดูล python ดังแสดงด้านล่าง: ie find rest_framework module
บน Ubuntu 12.04 ตัวอย่างเช่นแพ็คเกจ numpy สำหรับ python2 สามารถดูได้ที่:
/usr/lib/python2.7/dist-packages/numpy
แน่นอนว่านี่ไม่ใช่คำตอบทั่วไป
โมดูลหลามทั้งหมดไม่ได้เขียนในหลาม Datetime เกิดขึ้นเป็นหนึ่งในนั้นที่ไม่ใช่และ (บน linux) คือ datetime.so
คุณจะต้องดาวน์โหลดซอร์สโค้ดไปยังไลบรารี่มาตรฐานของไพ ธ อน
สำหรับผู้ที่ชื่นชอบโซลูชัน GUI: หากคุณใช้ gui เช่น Spyder (ส่วนหนึ่งของการติดตั้ง Anaconda) คุณสามารถคลิกขวาที่ชื่อโมดูล (เช่น "csv" ใน "import csv") และเลือก "go" to definition "- จะเป็นการเปิดไฟล์ แต่จะอยู่ด้านบนสุดคุณสามารถดูตำแหน่งไฟล์ที่แน่นอน (" C: .... csv.py ")
หากคุณไม่ได้ใช้ล่ามคุณสามารถเรียกใช้รหัสด้านล่าง:
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
อีกวิธีในการตรวจสอบว่าคุณติดตั้งงูหลามหลายรุ่นจากเทอร์มินัลหรือไม่
-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
ใน IDE อย่าง Spyder ให้นำเข้าโมดูลแล้วเรียกใช้โมดูลนั้น ๆ ป้อนคำอธิบายรูปภาพที่นี่
str()
โมเดลเป็นคำอธิบายที่แม่นยำยิ่งขึ้นของสิ่งที่คุณกำลังทำในสกรีน