web-gelistirme-sc.com

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

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.

429
Daryl Spitzer

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.

339
Moe

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!

205
jblocksom

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

inspectNAME _ modülü — özellikle getfileveya getsourcefilename__.

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

108
abarnert

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', ... ]
58
Greg Hewgill

Modüllerinizi kurmak için pip kullanıyorsanız, sadece pip show $module konumu döndürülür.

46

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

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'
28
Bjarke Ebert

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

12
Vijay

Python 3.2’de yeni olanları şimdi kullanabilirsiniz; dis modülünden code_info(): http://docs.python.org/dev/whatsnew/3.2.html#dis

10
Tom

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

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

Pencerelerde python modülünün yerini aşağıda gösterildiği gibi bulabilirsiniz: yani rest_framework modülünü bulabilirsiniz enter image description here

6
Dun0523

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

4
nexayq

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

0
Alona

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.

0
JimB