繁体   English   中英

如何使用来自不同脚本的相同导入?

How can I use the same imports from a different script?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有script1.py其中

from itertools import izip_longest, islice

script1.py某个地方使用了islice

我还有另一个脚本script2.py ,它需要在script1.py自动执行,因为script1的输出文件是script2的输入文件。 问题是, script2也需要使用islice 有没有使用它,而不用导入的方式islice再次script2

2 个回复

您可以在此处执行的操作是从script1导入* ,它也将包括其所有导入。 像这样:

# in script2.py
from script1 import *

这样,您只需要执行一次导入。 你是这个意思吗?

script2使用islicescript2

from itertools import islice

Python中的导入机制非常聪明。 导入模块不会每次都自动加载模块。 第一步始终是检查模块是否已经在sys.modules 如果是(如您的情况),则将适当的现有引用绑定到名称空间中的名称。

让我们看一个具体的示例,其中包含以下两个模块:

mod1.py

from itertools import izip_longest, islice
from mod2 import some_function

# code that uses islice and some_function

mod2.py

from itertools import islice

def some_function():
     # do the thing

如果运行mod1 ,则会发生以下(已编辑)事件序列:

  1. 创建一个空的模块对象,并将其注册/缓存在sys.modules['mod1']sys.modules['__main__'] ,具体取决于您运行脚本的方式。
  2. 开始执行mod1.py的代码。
  3. 检查itertools是否在sys.modules :不是
    1. 做一些魔术来查找,注册itertools并将其加载到sys.modules['itertools']
    2. izip_longestislice属性添加到不完整的mod1中的全局名称空间中
  4. 检查mod2是否在sys.modules :不是
    1. 做一些魔术来找到mod2并创建一个空的sys.modules['mod2']
    2. 开始执行mod2.py的代码。
    3. 检查itertools是否在sys.modules
    4. islice属性添加到不完整的mod2中的全局名称空间中。 这基本上等效于此时执行islice = sys.modules['itertools'].islice 这里什么都没装。
    5. 执行def语句创建一个函数对象,并将其添加到名称为some_funcmod2全局命名空间中。
    6. mod2现在已完全加载
  5. 执行mod1剩余的代码

因此,您可以看到,虽然可以说itertools模块在技术上被导入了两次,但仅加载了一次。 第二次,名称islice绑定到本地名称。

您可以在此处阅读有关整个过程的官方文档: https : //docs.python.org/2/reference/simple_stmts.html#the-import-statement 从至少一个版本2.0开始,此事件序列已在一个或另一个实现中出现: https : //docs.python.org/2.0/ref/import.html 您可能还想在这里阅读有关模块一般工作原理的更多信息: https : //docs.python.org/2/tutorial/modules.html 通常,我发现官方文档可能是Stack Overflow之外最好的Python老师。

要记住的另一件事是模块不共享名称空间。 模块内的全局变量只是该特定模块对象的属性。 但是,您可能会执行以下操作:

mod2.py

from itertools import islice

def some_function(): pass

mod1.py

import mod2

#use mod2.some_function and mod2.islice as attributes of mod2

这样,您只有一个明确的islice导入。 但是我不认为这是一种非常pythonic的方法。 Python的主要原则之一是“显式胜于隐式”,可读性比简洁性更重要。 当您使用mod2.islice ,对读者的含义是mod2定义的函数版本不同于内置函数。

顺便说一句,考虑尽快迁移到Python 3.6+。 有许多改进和新功能。 不再支持Python 2.x,并且许多流行的第三方库(例如numpy)将在即将发布的版本中完全放弃对Python 2的支持。

1 React 包的 CDN 链接以及在使用来自 CDN 的脚本的 React 时如何导入它

我在没有 NPM 和其他工具的情况下尝试 React,而是通过添加 CDN 链接来使用它,但是如何导入依赖包,例如 useState 钩子? 如果它是通过另一个脚本标签添加的,那么相同的 CDN 链接是什么? 下面是我的代码, 在这里我会得到错误, useState 未定义。 注意:这只是为了使 ...

2 使用来自不同库的相同功能的不同结果

这是一些代码: 当我输入1000000000000000000和2时,应该返回1000000000000000002 。 如果我尝试用cmath做它将返回1000000000000000000 ,但如果我使用cstdlib它将返回1000000000000000002 。 为什么 ...

2017-08-12 15:14:03 2 329   c++/ cmath
3 使用来自不同控件的相同视图?

我有一个Member和Staff控制器,这两个控件都需要对Search和SearchResults视图使用通用的代码视图。 现在,这些视图位于Member控制器中。 所以我的问题是如何管理像URL Member/Search和Staff/Search和Member/SearchResul ...

4 使用来自 Anaconda 的包的 Python 脚本

我对此很陌生,如果这已经得到回答或者是一个愚蠢的问题,我会提前道歉,我似乎无法找到答案。 我正在 Anaconda 中构建脚本,因为我发现布局非常有用。 我正在尝试制作一个将由 bat 文件调用的脚本,以便我可以安排它。 我发现当我编写一个 python 文件并保存它时,它无法导入与 anaco ...

5 使用来自单独的Gradle脚本的插件

我一直在使用插件来生成一些文档。 当我将其代码放入每个包的build.gradle内时,它可以正常工作。 但是,与其将这个插件放置在多个build.gradle文件中,我不希望将其放置在单独的gradle脚本中,以使所有内容都更加集中。 但是,当我这样做时,我得到一个错误: ...

6 如何使用来自不同脚本的变量作为方法参数

我一直在努力寻找一种需要检查的方法,然后更改来自单独脚本和对象的变量。 我正在尝试检查数组中是否有不为空的条目,以及我的占位符中尚未使用的条目。 当这两个都为真时,它应该将该数组的内容复制到我的 actualReadIn 字符串变量中,该变量保存在另一个脚本中。 Categories是我正在读取的 ...

7 使用来自其他脚本输出的选项菜单创建bash脚本

如果这很简单,请原谅我,但我不是程序员,所以我很难说出什么容易和难。 我有一个bash脚本,我用它(别人写的)来查找内部客户数据,我基本上在其中运行“ info customername”,并且它在我们的内部客户数据库中搜索与该客户名称匹配的所有客户记录,并输出一个包含其帐户的列表数字(都 ...

2013-08-12 14:05:23 2 895   bash/ menu
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM