在Python中,如果要以编程方式导入模块,可以执行以下操作:
module = __import__('module_name')
Run Code Online (Sandbox Code Playgroud)
如果要导入子模块,您会认为这只是一个简单的问题:
module = __import__('module_name.submodule')
Run Code Online (Sandbox Code Playgroud)
当然,这不起作用; 你module_name再来一次 你必须做:
module = __import__('module_name.submodule', fromlist=['blah'])
Run Code Online (Sandbox Code Playgroud)
为什么?实际值fromlist似乎根本不重要,只要它不是空的.要求一个论点,然后忽略它的价值观有什么意义呢?
Python中的大多数东西似乎都是有充分理由的,但对于我的生活,我无法对这种行为存在任何合理的解释.
我有一个 foo.py
def foo():
print "test"
Run Code Online (Sandbox Code Playgroud)
在IPython中我使用:
In [6]: import foo
In [7]: foo.foo()
test
Run Code Online (Sandbox Code Playgroud)
然后我改为foo():
def foo():
print "test changed"
Run Code Online (Sandbox Code Playgroud)
在IPython中,调用的结果仍然是test:
In [10]: import foo
In [11]: foo.foo()
test
Run Code Online (Sandbox Code Playgroud)
然后我用:
In [15]: del foo
In [16]: import foo
In [17]: foo.foo()
test
Run Code Online (Sandbox Code Playgroud)
我删除了foo.pyc相同的文件夹foo.py存在,但仍然没有运气.
我可以知道如何在运行时重新导入更新的代码吗?
我想知道在Python应用程序中导入包的首选方法.我有这样的包结构:
project.app1.models
project.app1.views
project.app2.models
Run Code Online (Sandbox Code Playgroud)
project.app1.views进口project.app1.models和project.app2.models.有两种方法可以实现这一点.
绝对进口:
import A.A
import A.B.B
Run Code Online (Sandbox Code Playgroud)
或者使用PEP 328在Python 2.5中引入的显式相对导入:
# explicit relative
from .. import A
from . import B
Run Code Online (Sandbox Code Playgroud)
什么是最pythonic的方式来做到这一点?
假设我有以下目录结构:
a\
__init__.py
b\
__init__.py
c\
__init__.py
c_file.py
d\
__init__.py
d_file.py
Run Code Online (Sandbox Code Playgroud)
在a包中__init__.py,c导入包.但是c_file.py进口a.b.d.
程序失败,说尝试导入b时不存在.(它确实不存在,因为我们正在进口它.)c_file.pya.b.d
如何解决这个问题呢?
在Python中,是否存在C预处理器语句的类似物,例如?:
#define MY_CONSTANT 50
另外,我有一个很大的常量列表,我想导入几个类.是否有类似的方法将常量声明为.py文件中的上述长序列语句并将其导入另一个.py文件?
编辑.
该文件Constants.py为:
#!/usr/bin/env python
# encoding: utf-8
"""
Constants.py
"""
MY_CONSTANT_ONE = 50
MY_CONSTANT_TWO = 51
Run Code Online (Sandbox Code Playgroud)
并myExample.py读:
#!/usr/bin/env python
# encoding: utf-8
"""
myExample.py
"""
import sys
import os
import Constants
class myExample:
def __init__(self):
self.someValueOne = Constants.MY_CONSTANT_ONE + 1
self.someValueTwo = Constants.MY_CONSTANT_TWO + 1
if __name__ == '__main__':
x = MyClass()
Run Code Online (Sandbox Code Playgroud)
编辑.
从编译器,
NameError:"未定义全局名称'MY_CONSTANT_ONE'"
第13行的myExample中的函数init self.someValueOne = Constants.MY_CONSTANT_ONE + 1复制输出程序在0.06秒后退出代码#1.
我可以通过多种方式在Python中导入模块而感到困惑.
import X
import X as Y
from A import B
Run Code Online (Sandbox Code Playgroud)
我一直在阅读有关作用域和名称空间的内容,但我想就什么是最佳策略,在哪种情况下以及为什么,提供一些实用的建议.是否应该在模块级别或方法/功能级别进行导入?在__init__.py模块代码本身中?
我的问题并没有真正回答" Python包 - 按类导入,而不是文件 ",尽管它显然是相关的.
所以我试图使用unittest.mock在我的单元测试中模拟我的一些方法.我做:
from unittest.mock import MagicMock
f = open("data/static/mock_ffprobe_response")
subprocess.check_output = MagicMock(return_value=f.read())
f.close()
Run Code Online (Sandbox Code Playgroud)
但我得到:
ImportError: No module named mock
Run Code Online (Sandbox Code Playgroud)
我试过了:
pip install mock
Run Code Online (Sandbox Code Playgroud)
它仍然无法正常工作.
首先关闭所有:对不起,我知道有很多关于相关进口的问题,但我没有找到解决方案.如果可能,我想使用以下目录布局:
myClass/
__init__.py
test/
demo.py
benchmark.py
specs.py
src/
__init__.py
myClass.py
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:
包中的测试文件如何正确导入myClass.py?
如果你将libC/myClass中的myClass作为子模块或者包含/ myClass,你将如何从外部导入包?
到目前为止,我找不到一个优雅的解决方案.根据我的理解,Guido的决定应该可以做,from ..src import myClass但这会出错:
ValueError: Attempted relative import in non-package
看起来它不会将myClass视为包.阅读文档:
需要__init__.py文件才能使Python将目录视为包含包;
我似乎缺少一些指定包的脚本的东西,我应该使用.pth吗?
您如何优雅地处理失败的未来功能导入?如果用户使用Python 2.5运行,并且我的模块中的第一个语句是:
from __future__ import print_function
Run Code Online (Sandbox Code Playgroud)
为Python 2.5编译此模块将失败,并带有:
File "__init__.py", line 1
from __future__ import print_function
SyntaxError: future feature print_function is not defined
Run Code Online (Sandbox Code Playgroud)
我想告诉用户他们需要用Python> = 2.6重新运行程序,并且可能提供一些如何操作的说明.但是,引用PEP 236:
在future_statement之前可以出现的唯一行是:
- 模块docstring(如果有的话).
- 评论.
- 空白行.
- 其他future_statements.
所以我做不了类似的事情:
import __future__
if hasattr(__future__, 'print_function'):
from __future__ import print_function
else:
raise ImportError('Python >= 2.6 is required')
Run Code Online (Sandbox Code Playgroud)
因为它产生:
File "__init__.py", line 4
from __future__ import print_function
SyntaxError: from __future__ imports must occur at the beginning of the file
Run Code Online (Sandbox Code Playgroud)
来自PEP的这个片段似乎给了内联的希望:
问:我想将future_statements包装在try/except块中,因此我可以使用不同的代码,具体取决于我正在运行的Python版本.为什么我不能?
A:对不起!try/except是一个运行时功能; future_statements主要是编译时的噱头,你的try/except在编译完成后很久就会发生.也就是说,当你尝试使用/ except时,对模块有效的语义已经完成了.由于试/除非将无法完成它看起来 像它应该做到,它只是不允许的.我们还希望保持这些特殊陈述非常容易找到和识别.
请注意,您 …
我有一个与内置模块冲突的模块.例如,在中myapp.email定义的模块myapp/email.py.
我可以myapp.email在我的代码中的任何地方引用而没有问 但是,我需要从我的电子邮件模块中引用内置电子邮件模块.
# myapp/email.py
from email import message_from_string
Run Code Online (Sandbox Code Playgroud)
它只发现自己,因此提出了一个ImportError,因为myapp.email没有message_from_string方法. import email我尝试时会导致同样的问题email.message_from_string.
有没有本地支持在Python中执行此操作,或者我是否仍然将我的"电子邮件"模块重命名为更具体的内容?
python ×10
python-import ×10
constants ×1
dependencies ×1
importerror ×1
ipython ×1
overloading ×1
package ×1
python-2.7 ×1
runtime ×1