Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取Python类或函数的导入方式_Python_Python Module - Fatal编程技术网

获取Python类或函数的导入方式

获取Python类或函数的导入方式,python,python-module,Python,Python Module,我如何知道类或函数是如何在python中导入的?我知道存在\uuuuu模块,但这并不总是有效的。\uuuu模块失败的示例: >>> from os.path import join >>> join.__module__ 'ntpath' 在那个例子中,我希望得到os.pathntpath是定义函数的地方,而不是我从中导入函数的包 编辑: 具体地说,我希望使用os.path而不是ntpath的原因是os.path与平台无关,而ntpath仅存在于Window

我如何知道类或函数是如何在python中导入的?我知道存在
\uuuuu模块
,但这并不总是有效的。
\uuuu模块
失败的示例:

>>> from os.path import join
>>> join.__module__
'ntpath'
在那个例子中,我希望得到
os.path
ntpath
是定义函数的地方,而不是我从中导入函数的包

编辑

具体地说,我希望使用
os.path
而不是
ntpath
的原因是
os.path
与平台无关,而
ntpath
仅存在于Windows上。类似地,在*nix系统上,
os.path
是使用
posixpath
实现的。如果没有人能给我一个可靠的方法来解决这个问题,我想一个可以接受的替代方法是某种映射,我可以使用这种映射,从实现模块映射回跨平台模块。也就是说,开始的时候看起来是这样的:

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

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

remote = Remote(hostname, username, password)
pathOnRemoteMachine = remote.join(component1, component2)
我只需要作为标准Python安装(特别是2.7)一部分的模块

第二次编辑

我想让写这样的东西成为可能:

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

}
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
通过在调用名称空间中查找属性名称(使用
inspect
中的一些方法)来实现
\uuuuuuu getattr\uuuuu
,它发现在调用名称空间中
连接
是一个函数。它需要知道可以从何处导入
join
,以便告诉远程Python实例导入相同的函数。由于本地Python实例可以在与远程Python实例不同的操作系统上运行(即,本地可以是Windows,远程可以是RedHat),因此我不需要特定于实现的模块(
ntpath
),我需要跨平台模块(
OS.path

我还将处理需要从来自pip的模块导入的场景,方法是告诉远程机器首先从pip下载该模块,或者需要从用户编写的文件导入,方法是复制该文件


因此,提供一种非常优雅(IMO)的方法来使用本地Python实例控制远程Python实例,这是一个巨大的魔法和技巧

>>> import sys
>>> from os.path import join
>>> sys.modules[join.__module__]
"<path/posixpath.pyc>"
导入系统 >>>从os.path导入联接 >>>系统模块[连接模块] ""

但是,这只会给出实际的模块,而不是引用的名称,例如(os.path)。不确定如何才能知道函数是如何导入的,只是它的定义位置。

这个问题很难解决。在您的示例中,
ntpath
是从中导入的模块。您试图做什么?也许有更好的方法。为什么你关心得到平台无关的结果,在*nix上你会得到posixpath,在windows上你会得到ntpath,看起来仍然是可移植的。上面的回声,你想做什么?@Two Bitalchest:我想获取一行在本地计算机上有效的代码,并在python的远程实例上运行它,该实例可能具有相同的OS.Neat,也可能不具有相同的OS.Neat,但这揭示了确切的问题。我想获得
os.path
,因为它是独立于平台的
ntpath
是如何在Windows上实现
os.path
的,而
posixpath
是如何在*nix系统上实现
os.path
的。很抱歉,不确定这是否可行,因为os.path没有保留。请参阅我的编辑,以获取可能的替代答案方法。听起来非常类似,我希望我早知道这一点,这样我就不会费心沿着我所做的路走下去了。但在这一点上,我觉得完成我开始的工作要比学习另一个图书馆容易得多。