Bagaimana saya belajar di mana file sumber untuk modul Python tertentu diinstal? Apakah metode ini berbeda di Windows daripada di Linux?
Saya mencoba mencari sumber datetime
modul khususnya, tetapi saya tertarik pada jawaban yang lebih umum juga.
Bagaimana saya belajar di mana file sumber untuk modul Python tertentu diinstal? Apakah metode ini berbeda di Windows daripada di Linux?
Saya mencoba mencari sumber datetime
modul khususnya, tetapi saya tertarik pada jawaban yang lebih umum juga.
Jawaban:
Untuk modul python murni, Anda dapat menemukan sumbernya dengan melihatnya themodule.__file__
. Modul datetime, bagaimanapun, ditulis dalam C, dan karena itu datetime.__file__
menunjuk ke file .so (tidak ada datetime.__file__
pada Windows), dan karena itu, Anda tidak dapat melihat sumbernya.
Jika Anda mengunduh tarball sumber python dan mengekstraknya, kode modul dapat ditemukan di subdirektori Modul .
Misalnya, jika Anda ingin menemukan kode datetime untuk python 2.6, Anda bisa melihatnya
Python-2.6/Modules/datetimemodule.c
Anda juga dapat menemukan versi Mercurial terbaru di web di https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c
Menjalankan python -v
dari baris perintah akan memberi tahu Anda apa yang sedang diimpor dan dari mana. Ini berfungsi untuk saya di Windows dan 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
...
Saya tidak yakin apa itu mtime buruk pada instalasi saya!
built-in
modul?
Saya menyadari jawaban ini terlambat 4 tahun, tetapi jawaban yang ada menyesatkan orang.
Cara yang tepat untuk melakukan ini adalah tidak pernah __file__
, atau mencoba untuk berjalan sys.path
dan mencari sendiri, dll. (Kecuali jika Anda harus kompatibel ke belakang melampaui 2.1).
Ini inspect
modul — khususnya, getfile
atau getsourcefile
.
Kecuali Anda ingin belajar dan menerapkan aturan-aturan (yang didokumentasikan, tetapi menyakitkan, untuk CPython 2.x, dan tidak didokumentasikan sama sekali untuk implementasi lain, atau 3.x) untuk pemetaan .pyc
ke .py
file; berurusan dengan arsip .zip, telur, dan paket modul; mencoba berbagai cara untuk mendapatkan jalur ke .so
/ .pyd
file yang tidak mendukung __file__
; mencari tahu apa yang dilakukan Jython / IronPython / PyPy; dll. Dalam hal ini, lakukanlah.
Sementara itu, setiap sumber versi Python dari 2.0+ tersedia online di http://hg.python.org/cpython/file/X.Y/
(misalnya, 2.7 atau 3.3 ). Jadi, setelah Anda menemukan itu inspect.getfile(datetime)
adalah file .so
atau .pyd
seperti /usr/local/lib/python2.7/lib-dynload/datetime.so
, Anda dapat mencarinya di dalam direktori Modul. Tegasnya, tidak ada cara untuk memastikan mana file mendefinisikan modul yang, tapi hampir semua dari mereka adalah baik foo.c
atau foomodule.c
, sehingga seharusnya tidak sulit untuk menebak bahwa datetimemodule.c adalah apa yang Anda inginkan.
__file__
tidak berlaku untuk non-builtin? Saya mengerti di mana merangkak sys.path bisa menyakitkan (terutama tanpa mengetahui tentang meta_path), tetapi apakah kekhawatiran Anda tentang penempatan nama antara __file__
definisi dan binari?
__file__
bekerja, inspect.getfile
bekerja; tidak ada situasi di mana menebak apakah menggunakan __file__
akan lebih baik daripada hanya menggunakan modul inspeksi.
The sys.path
daftar berisi daftar direktori yang akan dicari untuk modul saat runtime:
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)'
akan membiarkan Anda melihatnya tanpa harus jatuh ke dalam python interaktif.
python -c 'import sys; print("\n".join(sys.path))'
Jika Anda menggunakan pip untuk menginstal modul Anda, hanya pip show $module
lokasi yang dikembalikan.
$module
itu dimaksudkan sebagai variabel pengganti, tidak secara harfiah apa yang akan diketik seseorang. Misalnya, m=numpy; pip show $m
... dll, untuk apa pun m
)
dari pustaka standar coba 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 dan masih bisa mengimpornya. Ini membantu saya menemukan di mana file-file itu berada (sehingga saya bisa menghapusnya) ketika solusi lain tidak membantu.
imp
paket tidak digunakan lagi (sejak versi 3.4) mendukung importlib
(sejak 3.1) docs.python.org/3.6/library/imp.html
import importlib
laluimportlib.util.find_spec('fontTools')
datetime
adalah modul builtin, jadi tidak ada file sumber (Python).
Untuk modul yang berasal dari .py
(atau .pyc
) file, Anda dapat menggunakan mymodule.__file__
, misalnya
> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
Dalam juru bahasa python Anda dapat mengimpor modul tertentu dan kemudian ketik bantuan (modul). Ini memberikan rincian seperti Nama, File, Modul Dokumen, Deskripsi dkk.
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
Berikut ini adalah satu-liner untuk mendapatkan nama file untuk sebuah modul, cocok untuk alias shell:
echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)' | python -
Siapkan sebagai alias:
alias getpmpath="echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)' | python - "
Menggunakan:
$ getpmpath twisted
/usr/lib64/python2.6/site-packages/twisted/__init__.pyc
$ getpmpath twisted.web
/usr/lib64/python2.6/site-packages/twisted/web/__init__.pyc
Baru dalam Python 3.2, sekarang Anda dapat menggunakan mis code_info()
dari modul dis:
http://docs.python.org/dev/whatsnew/3.2.html#dis
Lihatlah perintah "cdp" yang bagus ini untuk melakukan cd ke direktori yang berisi sumber untuk modul Python yang ditunjukkan:
cdp () {
cd "$(python -c "import os.path as _, ${1}; \
print _.dirname(_.realpath(${1}.__file__[:-1]))"
)"
}
Tidak semua modul python ditulis dalam python. Datetime kebetulan menjadi salah satu dari mereka yang tidak, dan (di linux) adalah datetime.so.
Anda harus mengunduh kode sumber ke pustaka standar python untuk mendapatkannya.
Bagi mereka yang lebih suka solusi GUI: jika Anda menggunakan gui seperti Spyder (bagian dari instalasi Anaconda), Anda bisa mengklik kanan nama modul (seperti "csv" di "import csv") dan pilih "go ke definisi "- ini akan membuka file, tetapi juga di atas Anda dapat melihat lokasi file yang tepat (" C: .... csv.py ")
Jika Anda tidak menggunakan penerjemah maka Anda dapat menjalankan kode di bawah ini:
import site
print (site.getsitepackages())
Keluaran:
['C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']
Elemen kedua di Array akan menjadi lokasi paket Anda. Pada kasus ini:
C:\Users\<your username>\AppData\Local\Programs\Python\Python37\lib\site-packages
Cara lain untuk memeriksa apakah Anda memiliki beberapa versi python yang diinstal, dari terminal.
-MBP: ~ python3 -m pip tampilkan pyperclip
Lokasi: /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-
MBP: ~ python -m pip menunjukkan pyperclip
Lokasi: / Pengguna /umeshvuyyuru/Library/Python/2.7/lib/python/site-packages
Dalam IDE seperti Spyder, impor modul lalu jalankan modul satu per satu. masukkan deskripsi gambar di sini
str()
model adalah deskripsi yang lebih akurat tentang apa yang Anda lakukan di tangkapan layar, plus IDE tampaknya tidak relevan untuk solusi ini