获取如何导入Python类或函数

时间:2015-03-17 19:46:34

标签: python python-module

如何弄清楚如何在python中导入类或函数?我知道__module__存在,但这并不总是有效。 __module__失败的示例:

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

在该示例中,我希望获得os.pathntpath是定义函数的地方,而不是我导入函数的包。

修改

具体而言,我希望获得os.path而不是ntpath的原因是因为os.path与平台无关,而ntpath仅存在于Windows上。同样,在* nix系统上,使用os.path实现posixpath。如果没有人能给我一个解决这个问题的可靠方法,我想一个可以接受的替代品是我可以使用的某种地图,从实现模块映射回到跨平台模块。 IE,启动它看起来像这样:

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

}

我只需要属于标准Python安装(特别是2.7)的模块。

第二次修改

我想写下这样的东西:

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中的一些方法。)它在调用命名空间{{}中找到它1}}是一个功能。它需要知道可以从哪里导入join,以便它可以告诉远程Python实例导入相同的函数。由于本地Python实例可以在远程Python实例的不同操作系统上运行(IE,本地可能是Windows而远程可能是RedHat),我不想要特定于实现的模块(在这种情况下为join) - 我想要跨平台模块(在这种情况下为ntpath)。

我还将通过告诉远程机器首先从pip下载它,或者需要通过复制从用户写入的文件导入的方案来处理需要从pip导出的模块导入的场景。档案结束。

因此,使用本地Python实例提供一种非常优雅(IMO)的方式来控制远程Python实例,这是一大堆魔法和黑客。

1 个答案:

答案 0 :(得分:2)

您可以索引到sys.modules,例如

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

但是,这只会给你实际的模块,而不是你引用的名称,例如: (os.path中)。不确定如何可以告诉函数是如何导入的,只是定义它的位置。