Belirli bir Python modülü için kaynak dosyanın nereye kurulduğunu nasıl öğrenebilirim? Yöntem Windows'ta Linux'takinden farklı mı?
datetime
Özellikle modülün kaynağını aramaya çalışıyorum , ancak daha genel bir cevapla da ilgileniyorum.
Belirli bir Python modülü için kaynak dosyanın nereye kurulduğunu nasıl öğrenebilirim? Yöntem Windows'ta Linux'takinden farklı mı?
datetime
Özellikle modülün kaynağını aramaya çalışıyorum , ancak daha genel bir cevapla da ilgileniyorum.
Yanıtlar:
Saf bir python modülü için kaynağı bakarak bulabilirsiniz themodule.__file__
. Bununla birlikte datetime modülü, C ile yazılır ve bu nedenle datetime.__file__
bir .so dosyasına işaret eder (datetime.__file__
Windows'da ) işaret eder ve bu nedenle kaynağı göremezsiniz.
Bir python kaynağı tarball'ı indirir ve çıkarırsanız, modüllerin kodu Modüller alt dizininde bulunabilir.
Örneğin, python 2.6 için datetime kodunu bulmak istiyorsanız,
Python-2.6/Modules/datetimemodule.c
En son Mercurial sürümünü web'de https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c adresinde de bulabilirsiniz.
python -v
Komut satırından çalıştırmak size neyin ithal edildiğini ve nereden alındığını söylemelidir. Bu benim için Windows ve Mac OS X'te ç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ü zamanların kurulumumda ne olduğundan emin değilim!
built-in
Modüller nerede ?
Bu cevabın 4 yıl geçtiğinin farkındayım, ancak mevcut cevaplar insanları yanıltıcı.
Bunu yapmanın doğru yolu asla __file__
, ya da yürümeye sys.path
ve kendinizi aramaya çalışmaktır , vb. (2.1'in ötesinde geriye dönük uyumlu olmanız gerekmedikçe).
Bu inspect
modül, özellikle getfile
veya getsourcefile
.
CPython 2.x için (belgelendirilmiş ancak acı verici olan ve diğer uygulamalar için hiç belgelenmemiş veya 3.x) dosyaları eşleştirmek .pyc
için kuralları öğrenmek ve uygulamak istemiyorsanız .py
; .zip arşivleri, yumurtaları ve modül paketleri ile uğraşmak; .so
/ .pyd
desteklenmeyen dosyalara giden yolu bulmanın farklı yollarını denemek__file__
; Jython / IronPython / PyPy'nin ne yaptığını bulmak; Bu durumda, bunun için gidin.
Bu arada, her Python sürümünün kaynağı 2.0+'dan itibaren çevrimiçi olarak http://hg.python.org/cpython/file/X.Y/
(ör. 2.7 veya 3.3 ) bulunabilir. Yani, inspect.getfile(datetime)
bir .so
veya .pyd
benzeri bir dosya olduğunu keşfettikten sonra /usr/local/lib/python2.7/lib-dynload/datetime.so
, Modules dizinine bakabilirsiniz. Açıkçası, hangi dosyanın hangi modülü tanımladığından emin olmanın bir yolu yoktur, ancak neredeyse hepsi ya foo.c
da ya da foomodule.c
, bu nedenle datetimemodule.c'nin istediğiniz şey olduğunu tahmin etmek zor olmamalıdır .
__file__
yerleşik olmayanlar için geçerli değildir? Tarama sys.path (özellikle meta_path hakkında bilmeden) ağrılı olabilir nerede anlıyorum, ancak __file__
tanımları ve ikili dosyalar arasındaki ad boşluğu ile ilgili endişeniz mi?
__file__
işe yarar, işe yarar inspect.getfile
; kullanıp kullanamayacağınızı tahmin __file__
etmenin sadece denetleme modülünü kullanmaktan daha iyi olacağı hiçbir durum yoktur .
sys.path
Liste zamanında modülleri için aranır dizinlerin listesini içerir:
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)'
etkileşimli python'a girmek zorunda kalmadan görüntülemenizi sağlar.
python -c 'import sys; print("\n".join(sys.path))'
Modüllerinizi kurmak için pip kullanıyorsanız, yalnızca pip show $module
konum döndürülür.
$module
bir yer tutucu değişken anlamına geliyordu, kelimenin tam anlamıyla ne yazın. Örneğin, m=numpy; pip show $m
... vb, herhangi biri için m
)
standart kütüphaneden imp.find_module komutunu deneyin
>>> 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 ve yine de alabilir. Bu, diğer çözümler yardımcı olmadığında dosyaların nerede olduğunu (böylece silebilirim) bulmama yardımcı oldu.
import importlib
sonraimportlib.util.find_spec('fontTools')
datetime
yerleşik bir modüldür, bu nedenle (Python) kaynak dosyası yoktur.
.py
(Veya .pyc
) dosyalardan gelen modüller için mymodule.__file__
, örn.
> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
Python yorumlayıcısında belirli modülü alabilir ve ardından help (module) yazabilirsiniz. Bu, Ad, Dosya, Modül Dokümanları, 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
İşte kabuk takma adı için uygun bir modülün dosya adını almak için bir astar:
echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)' | python -
Takma 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
Python 3.2'deki yenilikler artık örneğin code_info()
dis modülünden kullanılabilir:
http://docs.python.org/dev/whatsnew/3.2.html#dis
Belirtilen Python modülünün kaynağını içeren dizine cd yapmak için bu şık "cdp" komutuna göz atın :
cdp () {
cd "$(python -c "import os.path as _, ${1}; \
print _.dirname(_.realpath(${1}.__file__[:-1]))"
)"
}
Tüm python modülleri python ile yazılmaz. Tarih, olmayanlardan biri olur ve (linux'da) datetime.so'dur.
Bunu elde etmek için kaynak kodunu python standart kütüphanesine indirmeniz gerekir.
GUI çözümünü tercih edenler için: Spyder (Anaconda kurulumunun bir parçası) gibi bir gui kullanıyorsanız, modül adını sağ tıklayabilirsiniz ("import csv" içindeki "csv" gibi) ve "go to definition "- bu dosyayı açar, ancak üst kısımda tam dosya konumunu görebilirsiniz (" C: .... csv.py ")
Tercüman kullanmıyorsanız, aşağıdaki kodu çalıştırabilirsiniz:
import site
print (site.getsitepackages())
Çıktı:
['C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']
Array öğesindeki ikinci öğe paket konumunuz olacaktır. Bu durumda:
C:\Users\<your username>\AppData\Local\Programs\Python\Python37\lib\site-packages
Terminalden birden fazla python sürümünün yüklü olup olmadığını kontrol etmenin başka bir yolu.
-MBP: ~ python3 -m pip gösterisi pyperclip
Yer: /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-
MBP: ~ python -m pip gösterisi pyperclip
Konum: /Users/umeshvuyyuru/Library/Python/2.7/lib/python/site-packages
Spyder gibi bir IDE'de, modülü içe aktarın ve modülü tek tek çalıştırın. resim açıklamasını buraya girin
str()
Modelin içe aktarılması ve yazdırılması, ekran görüntüsünde ne yaptığınızın daha doğru bir açıklamasıdır, ayrıca IDE bu çözüm için önemsiz görünüyor