2015-03-17 2 views
1

Как я могу понять, как класс или функция была импортирована в python? Я знаю, что существует __module__, но это не всегда работает. Пример, в котором __module__ терпит неудачу:Получить как класс или функция Python был импортирован

>>> from os.path import join 
>>> join.__module__ 
'ntpath' 

В этом примере, я хотел бы получить os.path вместо этого. ntpath - это функция, которая была определена, а не пакет, из которого я импортировал функцию.

Edit:

В частности, по этой причине я хотел бы получить os.path вместо ntpath потому, что os.path зависит от платформы, тогда как ntpath существует только на Windows. Аналогично, в системах * nix os.path реализован с использованием posixpath. Если никто не сможет дать мне надежный способ решения этой проблемы, я предполагаю, что приемлемой заменой будет какая-то карта, которую я мог бы использовать, чтобы карты из модулей реализации возвращались в кросс-платформенные модули. IE, чтобы начать его это будет выглядеть следующим образом:

{ 
'nt'  : 'os', 
'ntpath' : 'os.path', 
'posixpath': 'os.path', 

} 

мне нужно только те модули, которые являются частью стандартного Python установки (в частности 2.7).

Второй Edit:

Я хочу, чтобы сделать возможным, чтобы написать что-то вроде этого:

from pyRemote import Remote # The module I'm writing 
from os.path import join 

remote = Remote(hostname, username, password) 
pathOnRemoteMachine = remote.join(component1, component2) 

Чтобы сделать эту работу, Remote реализует __getattr__ путем поиска имя атрибута в пространстве имен вызывающего (используя некоторые методы из inspect.) Он находит, что в вызывающем пространстве имен функция join является функцией. Он должен знать, откуда можно импортировать join, чтобы он мог передать удаленный экземпляр Python для импорта той же функции. Поскольку локальный экземпляр Python может работать на другой ОС с удаленного экземпляра Python (IE, локальный может быть Windows, а удаленный может быть RedHat), я не хочу, чтобы конкретный модуль реализации (ntpath в данном случае) - я хочу, чтобы кросс-платформенный модуль (os.path в этом случае).

Я также рассмотрю сценарий необходимости импорта из модуля, который пришел из pip, сообщив удаленному компьютеру о его загрузке из первого пункта или сценарий, необходимый для импорта из файла, написанного пользователем, путем копирования этот файл закончился.

Итак, это огромная куча магии и хаков, чтобы обеспечить очень элегантный (IMO) способ управления удаленным экземпляром Python с использованием локального экземпляра Python.

+2

Эта проблема неразрешима. –

+0

в вашем примере, 'ntpath' - это модуль, из которого он импортирован. – Tritium21

+0

Что вы пытаетесь сделать? Может быть, есть лучший способ. –

ответ

2

Вы можете указать в sys.modules, например.

>>> import sys 
>>> from os.path import join 
>>> sys.modules[join.__module__] 
"<path/posixpath.pyc>" 

Однако это даст вам фактический модуль, а не имя, которое вы ссылаетесь, например. (Os.path). Не знаете, как вы можете узнать, как импортируется функция, только там, где она определена.

+0

Уход, но это показывает точную проблему. Я хочу получить 'os.path', потому что это независимая от платформы. 'ntpath' - это то, как« os.path »реализуется в Windows, а' posixpath' - это то, как «os.path» реализован в системах * nix. – ArtOfWarfare

+0

Извините, не уверен, что это возможно, потому что os.path не сохраняется. – AChampion

+0

См. Мое редактирование для возможного альтернативного подхода ответа. – ArtOfWarfare

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