Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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';s";进口;将名称视为模块而不是函数?_Python_Python 2.7_Import - Fatal编程技术网

如何强制Python';s";进口;将名称视为模块而不是函数?

如何强制Python';s";进口;将名称视为模块而不是函数?,python,python-2.7,import,Python,Python 2.7,Import,我正在使用Symphy,遇到以下问题: >>> import sympy.utilities.lambdify >>> sympy.utilities.lambdify <function lambdify at 0x0000000003802B38> 哦,这是一个命名冲突 很明显,我可以使用实现的函数,但这不是我的问题 我的问题是:如何导入sympy.utilities.lambdify模块而不是函数 (我只是在这里用Symphy来举例说明。这

我正在使用Symphy,遇到以下问题:

>>> import sympy.utilities.lambdify
>>> sympy.utilities.lambdify
<function lambdify at 0x0000000003802B38>
哦,这是一个命名冲突

很明显,我可以使用
实现的函数
,但这不是我的问题

我的问题是:如何导入
sympy.utilities.lambdify
模块而不是函数


(我只是在这里用Symphy来举例说明。这是否是正确的库用法是无关紧要的。源代码是。)

明显的不一致是因为
lambdify
不是一个模块,而是一个包含多个函数定义的python文件。在一个名为<代码> bar .py <代码>的文件中考虑下面的例子:

def foo(): pass

def bar(): pass
from .bar import bar
>>> import tmp
>>> tmp
<module 'tmp' from '/home/user/python/tmp/__init__.py'>
>>> import tmp.bar
>>> tmp.bar
<function bar at 0x7f24426461e0>
>>> tmp.bar.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'foo'
>>> from tmp.bar import foo
>>> foo
<function foo at 0x7f2442646158>
from .lambdify import lambdify
然后从条码导入条码;打印(bar.\uu模块\uu)将为您提供
“bar”

导入lambdify的原因如下:
sympy.utilities
\uuuu init\uuuu
中的行:

from .lambdify import lambdify
>>> import sys
>>> 'tmp' in sys.modules
False
>>> import tmp.bar
>>> tmp.bar
<function bar at 0x7fc833025158>
>>> 'tmp.bar' in sys.modules
True
>>> tmp.bar.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'foo'
>>> sys.modules['tmp.bar'].foo
<function foo at 0x7fc833020f28>
也就是说,在
sympy.utilities
模块的
lambdify.py
文件中,有一个
lambdify()
的定义,它被导入到
sympy.utilities
命名空间中。因此,当您导入
sympy.utilities
时,您可以访问lambdify。但是您仍然可以通过sympy.utilities.lambdify import…中的
导入
lambdify.py
中定义的其他函数


您实际的问题是是否可以导入这样的模块。嗯,你可以,但你可能不应该。让我们用上面的
bar.py
对这种情况进行建模,并通过创建
\uuuu init\uuuu py
使其成为一个包:

def foo(): pass

def bar(): pass
from .bar import bar
>>> import tmp
>>> tmp
<module 'tmp' from '/home/user/python/tmp/__init__.py'>
>>> import tmp.bar
>>> tmp.bar
<function bar at 0x7f24426461e0>
>>> tmp.bar.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'foo'
>>> from tmp.bar import foo
>>> foo
<function foo at 0x7f2442646158>
from .lambdify import lambdify
将这两个文件放在名为
tmp
的目录中,我们得到了一个场景模型,其中有一个名为
tmp
的模块和一个“子模块”
bar
(但我认为它不是一个合适的子模块,缺少
\uu init\uuuuuuuuuuy
)。如果我们导入
tmp.bar
,就像导入
sympy
,也会发生同样的情况:

def foo(): pass

def bar(): pass
from .bar import bar
>>> import tmp
>>> tmp
<module 'tmp' from '/home/user/python/tmp/__init__.py'>
>>> import tmp.bar
>>> tmp.bar
<function bar at 0x7f24426461e0>
>>> tmp.bar.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'foo'
>>> from tmp.bar import foo
>>> foo
<function foo at 0x7f2442646158>
from .lambdify import lambdify
因此,虽然
tmp.bar
引用本地名称空间中的函数,但我们可以通过来自同一导入的
sys.modules['tmp.bar']
访问模块本身

简单地说:

>>> import sys
>>> import sympy.utilities.lambdify
>>> lambdify_module = sys.modules['sympy.utilities.lambdify']
>>> lambdify_module.implemented_function
<function implemented_function at 0x7fc83183ca60>
导入系统 >>>导入sympy.utilities.lambdify >>>lambdify_module=sys.modules['sympy.utilities.lambdify'] >>>lambdify_module.implemented_函数
这是特定于
symphy
的结构。有关实用程序
\uuuu init\uuuuu.py
,请参阅以下源代码:

def foo(): pass

def bar(): pass
from .bar import bar
>>> import tmp
>>> tmp
<module 'tmp' from '/home/user/python/tmp/__init__.py'>
>>> import tmp.bar
>>> tmp.bar
<function bar at 0x7f24426461e0>
>>> tmp.bar.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'foo'
>>> from tmp.bar import foo
>>> foo
<function foo at 0x7f2442646158>
from .lambdify import lambdify
它从本地模块
lambdify
导入函数
lambdify
;因此,
utilities.lambdify
就是这个函数

假设您希望真正导入模块,而不是函数,
lambdify
。也许是

import os
import imp

import sympy.utilities as mod
sub_mod_name = 'lambdify'
sub_mod_file = '{}.py'.format(sub_mod_name)

mod_loc = os.path.dirname(mod.__file__)
file_ = os.path.join(mod_loc, sub_mod_file)  # Full path for source file
sub_mod = imp.load_source(sub_mod_name, file_)  # Import module from source file

print sub_mod
# <module 'lambdify' from '/usr/local/lib/python2.7/dist-packages/sympy/utilities/lambdify.pyc'>
导入操作系统
进口小商品
将sympy.utilities作为mod导入
子模块名称='lambdify'
sub_mod_file='{}.py'。格式(sub_mod_名称)
mod_loc=os.path.dirname(mod.\u文件\u)
file_u=os.path.join(mod_loc,sub_mod_file)#源文件的完整路径
sub_mod=imp.load_源(sub_mod_名称,文件)#从源文件导入模块
打印子模块
# 

实际上,使用importlib似乎可以非常干净地完成这项工作:

import importlib
lamdify = importlib.import_module('sympy.utilities.lambdify')
print lambdify
  <module 'sympy.utilities.lambdify' from 'c:\python-2.7.8-amd64\lib\site-packages\sympy\utilities\lambdify.pyc'>
用法:
lambdify=import\u模块(lambda:sympy.utilities.lambdify)


虽然这看起来有点长,我不太清楚。

你能不能从sympy.utilities导入lambdify
?@KarthikRavindra:
>>从sympy.utilities导入lambdify
>>lambdify
是的,我同意,但问题是,从源代码来看,不是一个模块。如果实际上打算导入
lambdify
模块,则它是一个包中的文件,看起来布局设计非常糟糕。我怀疑你不可能很好地完成你想做的事情。@KarthikRavindra:我很困惑,如果它不是一个模块,那么为什么它是
实现的函数的值。uuu模块uu
…?这是一个很长的路要说我所要求的是不可能的吗?如果是,请明确提及;否则它就不能真正回答我的问题。@Mehrdad我相信是这样的,是的。我会尝试举一个小例子,让我的观点更清楚。@Mehrdad发现你可以做到这一点,但我怀疑这是非常笨拙的。我肯定地说,sympy开发人员并不打算让你这么做;但我知道你的问题是一般性的。这很聪明,我没有意识到你可以通过sys.modules以那种方式访问它。哈哈,太棒了!我现在觉得自己很傻,事后看来这是很明显的:)谢谢+1漂亮的接球,看起来很简单。+1这个看起来也不错!知道它与
sys.modules
解决方案有什么不同吗?有什么理由喜欢其中一个而不是另一个?@Mehrdad这确实在引擎盖下使用了
sys.modules
,但它是一个使用标准库的干净行(如果你计算导入
importlib
),因此可读性更好。它看起来很像一个常规的import语句,很容易理解。@Mehrdad我还想补充一点,importlib在python 2中添加了一些功能,而且如果您采用这种方法,就不必重复自己的操作(在我的回答中,比较
import submod\u name
then
sys.modules['submod\u name']
)@lxop:我找到了一种避免将模块名放入字符串的方法(我认为这是糟糕的代码)。如果您愿意,我建议您将其添加到您的答案中:
def import_u(lambda_u):import importlib;返回importlib.import\u模块('...join(lambda\uu.code\uuuu.co\u名称))
(用法:
lambdify=import(lambda:sympy.utilities.lambdify)