2014-07-27 4 views
0

Чтобы понять путь поиска модуля python, я пытался создать модуль по имени, которое уже доступно в стандартной библиотеке. Я создал файл «math.py» в моей текущей папке и имеет определение функции «factorial», которое принимает один аргумент. Теперь я хочу, чтобы, когда я импортирую математический модуль и вызываю функцию «factorial», моя функция вызывается, а не стандартная библиотека. Все документы говорят, что путь поиска, хранящийся в «sys.path», определяет порядок поиска и дает самый высокий приоритет текущему каталогу.Могу ли я переопределить путь поиска модуля в python

Но когда я запускаю свой код, я обнаружил, что мой математический модуль не загружается, и моя факториальная функция не вызывается. Python продолжает загружать и выполнять стандартные определения библиотек.

Где я буду неправильно

Вот файл mymain.py

print "running...............>>" 
import math 
print math.factorial(5) 

Это файл math.py (в том же каталоге, mymain.py)

print "math loaded" 
def factorial(i) : 
    return i+10 

И теперь я выполняю команду «python mymain.py»

+2

Это довольно удивительно, учитывая документацию на [sys.path] (https://docs.python.org/3/library/sys.html#sys.path) и [порядок поиска модулей] (https : //docs.python.org/3/tutorial/modules.html#the-module-search-path). Можете ли вы привести пример кода? – balu

+0

Я отредактировал мой вопрос, чтобы содержать образец кода – user3282758

+0

Я думаю, что путь поиска относится только к не встроенным модулям, но я не уверен. Почему вы все равно хотите перезаписать встроенный модуль Python? Похоже, он просто просит неприятностей. – TheSoundDefense

ответ

0

Я использовал эту технику для маскировки/переопределения функциональности в файл .pyc из библиотеки. Я использовал следующее заявление;

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) 

Это позволило механизму разрешения модуля найти модуль в родительской папке до той, что находится в библиотеке. Модули, которые я не переопределил, впоследствии обнаруживаются в местоположении библиотеки.

Этот оператор должен быть после import os, но перед всеми операциями импорта модуля библиотеки.

Смежные вопросы