标签: python-import

为什么Python的__import__需要fromlist?

在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中的大多数东西似乎都是有充分理由的,但对于我的生活,我无法对这种行为存在任何合理的解释.

python python-import

74
推荐指数
2
解决办法
2万
查看次数

如何将"重新导入"模块转换为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 overloading runtime ipython python-import

73
推荐指数
4
解决办法
5万
查看次数

Python模块的绝对与显式相对导入

我想知道在Python应用程序中导入包的首选方法.我有这样的包结构:

project.app1.models
project.app1.views
project.app2.models
Run Code Online (Sandbox Code Playgroud)

project.app1.views进口project.app1.modelsproject.app2.models.有两种方法可以实现这一点.

绝对进口:

import A.A
import A.B.B
Run Code Online (Sandbox Code Playgroud)

或者使用PEP 328Python 2.5中引入的显式相对导入:

# explicit relative
from .. import A
from . import B
Run Code Online (Sandbox Code Playgroud)

什么是最pythonic的方式来做到这一点?

python package python-import

73
推荐指数
3
解决办法
4万
查看次数

Python中的循环导入依赖项

假设我有以下目录结构:

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 dependencies circular-dependency python-import

72
推荐指数
4
解决办法
6万
查看次数

将一长串常量导入Python文件

在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 constants python-import

72
推荐指数
6
解决办法
8万
查看次数

Python导入有哪些好的经验法则?

我可以通过多种方式在Python中导入模块而感到困惑.

import X
import X as Y
from A import B
Run Code Online (Sandbox Code Playgroud)

我一直在阅读有关作用域和名称空间的内容,但我想就什么是最佳策略,在哪种情况下以及为什么,提供一些实用的建议.是否应该在模块级别或方法/功能级别进行导入?在__init__.py模块代码本身中?

我的问题并没有真正回答" Python包 - 按类导入,而不是文件 ",尽管它显然是相关的.

python python-import

71
推荐指数
5
解决办法
5万
查看次数

ImportError:没有名为mock的模块

所以我试图使用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)

它仍然无法正常工作.

python python-import importerror python-2.7

71
推荐指数
6
解决办法
7万
查看次数

用于相对进口的python包装

首先关闭所有:对不起,我知道有很多关于相关进口的问题,但我没有找到解决方案.如果可能,我想使用以下目录布局:

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 python-import

70
推荐指数
3
解决办法
6万
查看次数

如何优雅地处理由于旧解释器版本导致的失败的未来功能(__future__)导入?

您如何优雅地处理失败的未来功能导入?如果用户使用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时,对模块有效的语义已经完成了.由于试/除非将无法完成它看起来 像它应该做到,它只是不允许的.我们还希望保持这些特殊陈述非常容易找到和识别.

请注意,您 …

python python-import

68
推荐指数
3
解决办法
5万
查看次数

尝试导入与内置模块同名的模块会导致导入错误

我有一个与内置模块冲突的模块.例如,在中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 python-import

67
推荐指数
1
解决办法
3万
查看次数