Belirli bir Python modülünün kaynak dosyasının nereye kurulduğunu nasıl öğrenirim? Bu yöntem Windows'ta Linux'tan farklı mı?
Özellikle datetime
modülünün kaynağını aramaya çalışıyorum, ancak daha genel bir cevapla da ilgileniyorum.
Saf bir python modülü için kaynağı themodule.__file__
dosyasına bakarak bulabilirsiniz. Datetime modülü, C dilinde yazılmıştır ve bu nedenle datetime.__file__
, .so dosyasına işaret eder (Windows'ta datetime.__file__
yoktur) ve bu nedenle kaynağı göremezsiniz.
Bir python kaynak tarball'ı indirir ve çıkartırsanız, modüllerin kodunu Modülleri alt dizininde bulabilirsiniz.
Örneğin, python 2.6 için datetime kodunu bulmak istiyorsanız, şuraya bakabilirsiniz:
Python-2.6/Modules/datetimemodule.c
Ayrıca en yeni Mercurial sürümünü web'de https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c adresinde bulabilirsiniz.
python -v
komutunu komut satırından çalıştırmak, neyin içe aktarıldığını ve nereden alındığını size bildirmelidir. Bu benim için Windows ve Mac OS X'de çalışıyor.
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
...
Bu kötü mtime'ların kurulumumda ne olduğundan emin değilim!
Bu cevabın 4 yıl geciktiğini biliyorum, ancak mevcut cevaplar yanıltıcı insanlar.
Bunu yapmanın doğru yolu asla __file__
, ya da sys.path
'de dolaşmaya çalışmak ve kendinizi aramak vs. değildir (2.1'den geriye doğru uyumlu olmanız gerekmiyorsa).
inspect
NAME _ modülü — özellikle getfile
veya getsourcefile
name__.
.pyc
ile .py
dosyalarının eşleştirilmesi için kuralların (belgelendirilmiş, ancak acı verici, CPython 2.x için ve diğer uygulamalar için belgelenmemiş veya 3.x) öğrenmek ve uygulamak istemiyorsanız; .Zip arşivleri, yumurtaları ve modül paketleriyle uğraşmak; .so
/.pyd
dosyalarına giden yolun farklı şekillerini denemek __file__
; Jython/IronPython/PyPy'nin ne yaptığını bulmak; vb. Bu durumda, bunun için gidin.
Bu arada, her Python sürümünün 2.0+ kaynağından çevrimiçi olarak http://hg.python.org/cpython/file/X.Y/
(çevrimiçi olarak) mevcuttur (ör. 2.7 veya 3.3 ). Böylece, inspect.getfile(datetime)
dosyasının bir .so
veya .pyd
gibi bir /usr/local/lib/python2.7/lib-dynload/datetime.so
dosyası olduğunu öğrendiğinizde, onu Modüller dizini içinde arayabilirsiniz. Açıkçası, hangi dosyanın hangi modülü tanımladığından emin olmanın bir yolu yoktur, ancak neredeyse hepsi foo.c
veya foomodule.c
olduğundan, bu nedenle datetimemodule.c istediğin bu.
sys.path
listesi, çalışma zamanında modüller için aranacak dizinlerin listesini içerir:
python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.Zip', '/usr/local/lib/python2.5', ... ]
Modüllerinizi kurmak için pip kullanıyorsanız, sadece pip show $module
konumu döndürülür.
standart kütüphaneden denemek 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))
datetime
yerleşik bir modüldür, bu nedenle (Python) kaynak dosyası yoktur.
.py
(veya .pyc
) dosyalarından gelen modüller için mymodule.__file__
, ör.
> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
Python yorumlayıcısında, belirli bir modülü içe aktarabilir ve daha sonra yardım (modül) yazabilirsiniz. Bu, Ad, Dosya, Modül Belgeleri, Açıklama ve ark.
Ör:
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
Python 3.2’de yeni olanları şimdi kullanabilirsiniz; dis modülünden code_info()
: http://docs.python.org/dev/whatsnew/3.2.html#dis
İşte Shell aliasing için uygun bir modülün dosya adını almak için bir liner:
echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)' | python -
Diğer ad olarak ayarla:
alias getpmpath="echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)' | python - "
Kullanmak:
$ getpmpath twisted
/usr/lib64/python2.6/site-packages/twisted/__init__.pyc
$ getpmpath twisted.web
/usr/lib64/python2.6/site-packages/twisted/web/__init__.pyc
Bu şık "cdp" komut belirtilen Python modülünün kaynağını içeren dizine cd atın:
cdp () {
cd "$(python -c "import os.path as _, ${1}; \
print _.dirname(_.realpath(${1}.__file__[:-1]))"
)"
}
Pencerelerde python modülünün yerini aşağıda gösterildiği gibi bulabilirsiniz: yani rest_framework modülünü bulabilirsiniz
Ubuntu 12.04'te, örneğin python2 için numpy paketi, şurada bulunabilir:
/usr/lib/python2.7/dist-packages/numpy
Tabii ki, bu genel bir cevap değil
Bir GUI çözümü tercih edenler için: Spyder gibi bir GUI kullanıyorsanız (Anaconda kurulumunun bir parçası) modül adına sağ tıklayabilirsiniz (örneğin "csv al" içindeki "csv" gibi) ve "git" i seçin. tanım "- bu dosyayı açacak, ancak en üstte tam dosya konumunu da görebilirsiniz (" C: .... csv.py ")
Tüm python modülleri python ile yazılmaz. Datetime, onlardan biri olmaya başlar ve (linux'ta) datetime.so olur.
Kaynak kodunu almak için python standart kütüphanesine indirmeniz gerekir.