Làm cách nào để tìm vị trí của các nguồn mô-đun Python?


480

Làm cách nào để tìm hiểu nơi tệp nguồn cho một mô-đun Python cụ thể được cài đặt? Là phương pháp khác nhau trên Windows so với trên Linux?

Tôi đang cố gắng tìm kiếm nguồn của datetimemô-đun nói riêng, nhưng tôi cũng quan tâm đến một câu trả lời tổng quát hơn.

Câu trả lời:


375

Đối với một mô-đun python thuần, bạn có thể tìm nguồn bằng cách nhìn vào themodule.__file__. Tuy nhiên, mô-đun datetime được viết bằng C và do đó datetime.__file__trỏ đến tệp .so (không có datetime.__file__trên Windows) và do đó, bạn không thể thấy nguồn.

Nếu bạn tải xuống một tarball nguồn python và giải nén nó, mã của các mô-đun có thể được tìm thấy trong thư mục con Mô-đun .

Ví dụ: nếu bạn muốn tìm mã datetime cho python 2.6, bạn có thể xem

Python-2.6/Modules/datetimemodule.c

Bạn cũng có thể tìm thấy phiên bản Mercurial mới nhất trên web tại https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c


Nếu bạn chỉnh sửa câu trả lời của mình để chỉ ra rằng datetime .__ file__ trỏ đến .so trên Linux & Mac OS X (mặc dù trên Windows, đối tượng mô-đun datetime không có thuộc tính tệp ), tôi sẽ chấp nhận câu trả lời của bạn.
Daryl Spitzer

Thực tế trên Windows (ít nhất là trên phiên bản tôi đang sử dụng), datetime chỉ không có thuộc tính tệp .
Daryl Spitzer

221

Chạy python -vtừ dòng lệnh sẽ cho bạn biết những gì đang được nhập và từ đâu. Điều này hoạt động với tôi trên Windows và 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
...

Tôi không chắc những thứ xấu đó là gì khi cài đặt!


8
Mát mẻ! Bạn cũng có thể nhập vào câu lệnh nhập cụ thể của riêng mình sau khi nó mở ra trong chế độ tương tác để xem lib cụ thể đến từ đâu.
scorpiodawg

3
Các built-inmô-đun ở đâu?
loretoparisi

120

Tôi nhận ra câu trả lời này trễ 4 năm, nhưng những câu trả lời hiện có là những người hiểu lầm.

Cách đúng đắn để làm điều này là không bao giờ __file__, hoặc cố gắng đi qua sys.pathvà tìm kiếm chính mình, v.v. (trừ khi bạn cần phải tương thích ngược hơn 2.1).

Đó là inspectmô-đun đặc biệt, getfilehay getsourcefile.

Trừ khi bạn muốn tìm hiểu và thực hiện các quy tắc (được ghi lại, nhưng đau đớn, đối với CPython 2.x và hoàn toàn không được ghi lại cho các triển khai khác, hoặc 3.x) để ánh xạ .pycvào .pycác tệp; đối phó với tài liệu lưu trữ .zip, trứng và các gói mô-đun; thử các cách khác nhau để có được đường dẫn đến .so/ .pydtệp không hỗ trợ __file__; tìm ra những gì Jython / IronPython / PyPy làm; vv Trong trường hợp này, đi cho nó.

Trong khi đó, mọi nguồn của phiên bản Python từ 2.0+ đều có sẵn trực tuyến tại http://hg.python.org/cpython/file/X.Y/(ví dụ: 2.7 hoặc 3.3 ). Vì vậy, một khi bạn phát hiện ra đó inspect.getfile(datetime)là một tập tin .sohoặc , bạn có thể tra cứu nó trong thư mục Modules. Nói một cách chính xác, không có cách nào để chắc chắn tập tin nào xác định mô-đun nào, nhưng gần như tất cả chúng đều hoặc , do đó, không khó để đoán rằng datetimemodule.c là những gì bạn muốn..pyd/usr/local/lib/python2.7/lib-dynload/datetime.sofoo.cfoomodule.c


3
Tại sao __file__không được áp dụng cho những người không xây dựng? Tôi hiểu việc thu thập thông tin sys.path có thể gây đau đớn (đặc biệt là không biết về meta_path), nhưng bạn có lo lắng về việc đặt tên giữa các __file__định nghĩa và nhị phân không?

1
Tôi làm điều này trong 2.7.8 trên datetime và chỉ nhận được TypeError cho cả getfile và getourcefile. Cá nhân tôi đã cài đặt nhiều phiên bản python và tôi cần biết phiên bản datetimemodule.c của nó là gì, bởi vì ngay bây giờ tôi biết rằng nó không được chỉ vào phiên bản mà nó nên được chỉ ra cho phiên bản phiên dịch đang chạy ...
mmitchell

1
@mmitchell: Nếu bạn đang nhận TypeError từ notify.getfile (datetime), giả sử datetime thực sự là mô-đun chứ không phải cái gì khác mà bạn đã gán cho cùng tên, tôi khá chắc chắn rằng bạn đã tạo một bản dựng tùy chỉnh cho liên kết tĩnh trong datetime với trình thông dịch thay vì làm cho nó trở thành một mô-đun có thể tải. Nhưng có thể có những lý do khác mà tôi chưa từng nghĩ đến. Bạn cần hỏi một câu hỏi mới, và cung cấp thêm nhiều thông tin để tái tạo điều này.
abarnert

@mmitchell: Trong khi đó, không có cách nào để tìm ra phiên bản nào của datetimemodule.c, vì nó không trỏ vào datetimemodule.c, nó chỉ vào một mô-đun được biên dịch được xây dựng từ tệp C đó; tập tin C có thể không tồn tại trên hệ thống của bạn, có thể đã được chỉnh sửa kể từ khi bạn biên dịch nó, bất cứ điều gì.
abarnert

@tristan: Tôi không chắc là tôi hiểu những gì bạn đang hỏi, nhưng có lẽ điều này sẽ trả lời: Bất cứ khi nào __file__làm việc, inspect.getfilelàm việc; không có tình huống đoán xem có nên sử dụng __file__sẽ tốt hơn là chỉ sử dụng mô-đun kiểm tra.
abarnert

67

Các sys.pathdanh sách chứa danh sách các thư mục đó sẽ được tìm kiếm module khi chạy:

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)'sẽ cho phép bạn xem nó mà không cần phải thả vào python tương tác.
Joe Block

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

61

Nếu bạn đang sử dụng pip để cài đặt các mô-đun của mình, chỉ cần pip show $moduletrả lại vị trí.


10
(Tôi nghĩ rằng $moduleđã có nghĩa như là một biến giữ chỗ, chứ không phải theo nghĩa đen những gì người ta sẽ gõ Ví dụ,. m=numpy; pip show $m... vv, đối với bất kỳ m)
michael

đây nên được đánh dấu là câu trả lời chính xác nhất cho câu hỏi được hỏi.
Rahul G lòng

37

từ thư viện chuẩn hãy thử 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))

1
Cái này thật tuyệt. Tôi apt-get removelà DataDog và vẫn có thể nhập nó. Điều này giúp tôi tìm vị trí của các tệp (vì vậy tôi có thể xóa chúng) khi các giải pháp khác không giúp được.
sg

cho python3.x, các impgói bị phản đối (kể từ phiên bản 3.4) ủng hộ importlib(từ 3.1) docs.python.org/3.6/library/imp.html
michael

Bây giờ bạn cần sử dụng nó theo cách này cho python3. import importlibsau đóimportlib.util.find_spec('fontTools')
Medhat

33

datetime là một mô-đun dựng sẵn, vì vậy không có tệp nguồn (Python).

Đối với các mô-đun đến từ .py(hoặc .pyc) tệp, bạn có thể sử dụng mymodule.__file__, ví dụ:

> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'

12

Trong trình thông dịch python, bạn có thể nhập mô-đun cụ thể và sau đó nhập trợ giúp (mô-đun). Điều này cung cấp các chi tiết như Tên, Tệp, Tài liệu Mô-đun, Mô tả et al.

Ví dụ:

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


Điều này đã cho tôi một đường dẫn đầy đủ đến tệp mô-đun trong khi các câu trả lời khác chỉ đưa ra các đường dẫn tương đối. Cảm ơn.
Jerther

12

Đây là một lớp lót để lấy tên tệp cho mô-đun, phù hợp với bí danh shell:

echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)'  | python - 

Thiết lập như một bí danh:

alias getpmpath="echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)'  | python - "

Để sử dụng:

$ 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

Kiểm tra lệnh "cdp" tiện lợi này để cd vào thư mục chứa nguồn cho mô-đun Python được chỉ định:

cdp () {
  cd "$(python -c "import os.path as _, ${1}; \
    print _.dirname(_.realpath(${1}.__file__[:-1]))"
  )"
}

Cảm ơn! Đó chỉ là những gì tôi đang tìm kiếm. Thật kỳ lạ, họ sẽ không bao gồm thứ gì đó tương tự vào bản phân phối trăn.
Antony Hatchkins

9

Trên cửa sổ, bạn có thể tìm thấy vị trí của mô-đun python như dưới đây: tức là tìm mô-đun rest_framework nhập mô tả hình ảnh ở đây


4

Trên Ubuntu 12.04, ví dụ gói numpy cho python2, có thể được tìm thấy tại:

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

Tất nhiên, đây không phải là câu trả lời chung chung


0

Không phải tất cả các mô-đun python được viết bằng python. Datetime tình cờ là một trong số đó không phải là, và (trên linux) là datetime.so.

Bạn sẽ phải tải mã nguồn về thư viện chuẩn python để lấy nó.


2
Daryl: Bạn đã đánh giá sai câu trả lời của Jim, "Datetime tình cờ là một trong những mô-đun python không được viết bằng python".
Matthew Trevor

0

Đối với những người thích giải pháp GUI: nếu bạn đang sử dụng một gui như Spyder (một phần của bản cài đặt Anaconda), bạn có thể chỉ cần nhấp chuột phải vào tên mô-đun (chẳng hạn như "csv" trong "import csv") và chọn "go" để định nghĩa "- điều này sẽ mở tệp, nhưng trên đầu bạn có thể thấy vị trí tệp chính xác (" C: .... csv.py ")


0

Nếu bạn không sử dụng trình thông dịch thì bạn có thể chạy mã bên dưới:

import site
print (site.getsitepackages())

Đầu ra:

['C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']

Phần tử thứ hai trong Array sẽ là vị trí gói của bạn. Trong trường hợp này:

C:\Users\<your username>\AppData\Local\Programs\Python\Python37\lib\site-packages

0

Một cách khác để kiểm tra xem bạn có cài đặt nhiều phiên bản python không, từ thiết bị đầu cuối.

-MBP: ~ python3 -m pip hiển thị pyperclip

Vị trí: / Thư viện / Bộ sưu tập / Python.framework / Warions / 3.7 / lib / python3.7 / site-

MBP: ~ python -m pip hiển thị pyperclip

Vị trí: /Users/umeshvuyyuru/L Library / Python / 2.7 / lib / python / site-packages


-1

Trong một IDE như Spyder, nhập mô-đun và sau đó chạy mô-đun riêng lẻ. nhập mô tả hình ảnh ở đây


Nhập và in str()mô hình là một mô tả chính xác hơn về những gì bạn đang làm trong ảnh chụp màn hình, cộng với IDE dường như không liên quan đến giải pháp này
mousetail

2
Chào mừng bạn đến với StackOverflow! Xin vui lòng không đăng mã bằng hình ảnh. Hình ảnh khó đọc, không thể tìm kiếm và không thể xem được đối với một số độc giả. Thay vào đó, vui lòng bao gồm bất kỳ mã có liên quan trực tiếp trong phần câu trả lời của bạn.
Brian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.