Python modül kaynaklarının yerini nasıl bulabilirim?


480

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:


375

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.


Yanıtınızı Linux ve Mac OS X'te datetime .__ file__ dosyasının bir .so'ya işaret ettiğini (Windows'ta datetime modül nesnesinin dosya özniteliği olmamasına rağmen) belirtmek için düzenlerseniz, yanıtınızı kabul edeceğim.
Daryl Spitzer

Aslında Windows'ta (en azından kullandığım sürümde), datetime dosya özniteliğine sahip değil .
Daryl Spitzer

221

python -vKomut 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!


8
Güzel! Belirli bir lib'in nereden geldiğini görmek için etkileşimli modda açıldıktan sonra kendi özel içe aktarma ifadenizi de yazabilirsiniz.
scorpiodawg

3
built-inModüller nerede ?
loretoparisi

120

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.pathve kendinizi aramaya çalışmaktır , vb. (2.1'in ötesinde geriye dönük uyumlu olmanız gerekmedikçe).

Bu inspectmodül, özellikle getfileveya 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 .pyciçin kuralları öğrenmek ve uygulamak istemiyorsanız .py; .zip arşivleri, yumurtaları ve modül paketleri ile uğraşmak; .so/ .pyddesteklenmeyen 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 .soveya .pydbenzeri 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.cda ya da foomodule.c, bu nedenle datetimemodule.c'nin istediğiniz şey olduğunu tahmin etmek zor olmamalıdır .


3
Neden __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?

1
Bunu datetime üzerinde 2.7.8'de yapıyorum ve hem getfile hem de getsourcefile için bir TypeError alıyorum. Şahsen ben yüklü python birden fazla sürümü var ve ben datetimemodule.c WHICH sürümünü bilmek gerekir, çünkü şu anda çalışan yorumlayıcı sürümü göz önüne alındığında bir işaret değil biliyorum ...
mmitchell

1
@mmitchell: inspect.getfile (datetime) öğesinden bir TypeError alıyorsanız, datetime öğesinin aslında aynı adla atadığınız başka bir şey değil modül olduğunu varsayarsak, bunun için özel bir yapı oluşturduğunuz anlamına gelir. datetime'da yüklenebilir bir modül yapmak yerine statik olarak yorumlayıcıya bağlanır. Ama aklıma gelmeyen başka nedenler de olabilir. Yeni bir soru sormanız ve bunu yeniden oluşturmak için çok daha fazla bilgi vermeniz gerekir.
abarnert

@mmitchell: Bu arada, datetimemodule.c'in hangi sürümünü gösterdiğini bulmanın bir yolu yoktur, çünkü datetimemodule.c'yi işaret etmiyor, bu C dosyasından oluşturulan derlenmiş bir modüle işaret ediyor; C dosyası sisteminizde mevcut olmayabilir, derlediğinizden beri düzenlenmiş olabilir.
abarnert

@tristan: Ne istediğini anladığımdan emin değilim, ama belki bu cevap verecektir: Ne zaman __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 .
abarnert

67

sys.pathListe 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', ... ]

10
python -c 'import sys; print "\n".join(sys.path)'etkileşimli python'a girmek zorunda kalmadan görüntülemenizi sağlar.
Joe Block

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

61

Modüllerinizi kurmak için pip kullanıyorsanız, yalnızca pip show $modulekonum döndürülür.


10
(Bence $modulebir 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)
michael

bu, sorulan soru için en doğru cevap olarak işaretlenmelidir.
Rahul Goyal

37

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))

1
Bu fantastik. Ben apt-get removeDataDog 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.
sg

python3.x için, imppaket docs.python.org/3.6/library/imp.htmlimportlib
michael

Şimdi python3 için bu şekilde kullanmanız gerekiyor. import importlibsonraimportlib.util.find_spec('fontTools')
Medhat

33

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'

12

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


Bu bana modül dosyasına tam bir yol verirken, diğer cevaplar sadece göreceli yollar verdi. Teşekkürler.
Jerther

12

İş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


9

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]))"
  )"
}

Teşekkürler! Aradığım tek şey bu. Python dağıtımına böyle bir şey eklemeyecek kadar tuhaftı.
Antony Hatchkins

9

Pencerelerde python modülünün konumunu aşağıda gösterildiği gibi bulabilirsiniz: yani rest_framework modülünü bulun resim açıklamasını buraya girin


4

Ubuntu 12.04'te, örneğin python2 için numpy paketi şu adreste bulunabilir:

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

Tabii ki, bu genel bir cevap değil


0

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.


2
Daryl: Jim'in cevabını "Datetime, python ile yazılmayan python modüllerinden biri haline getirdi" şeklinde yanlış cevapladınız.
Matthew Trevor

0

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 ")


0

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

0

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


-1

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
mousetail

2
StackOverflow'a hoş geldiniz! Lütfen resim kullanarak kod göndermeyin. Görüntülerin okunması zordur, aranamaz ve bazı okuyucular tarafından görüntülenemez. Bunun yerine, lütfen ilgili kodu doğrudan cevabınızın gövdesine ekleyin.
Brian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.