GVKun编程网logo

是什么导致python模块两次导入?(python的模块导入和重载)

13

本文将分享是什么导致python模块两次导入?的详细内容,并且还将对python的模块导入和重载进行详尽解释,此外,我们还将为大家带来关于(任何)python模块的类型提示是什么?、Python怎么导

本文将分享是什么导致python模块两次导入?的详细内容,并且还将对python的模块导入和重载进行详尽解释,此外,我们还将为大家带来关于(任何)python模块的类型提示是什么?、Python 怎么导入自己写的模块:无法在 Python 中导入我自己的模块、python——怎样导入其他地方的python模块、Python从菜鸟到高手(4):导入Python模块的相关知识,希望对你有所帮助。

本文目录一览:

是什么导致python模块两次导入?(python的模块导入和重载)

是什么导致python模块两次导入?(python的模块导入和重载)

据我了解,python模块永远不会导入两次,即该模块中的代码仅在首次导入时才执行。随后的import语句只需将模块添加到导入范围即可。

我有一个名为“ TiledConvC3D.py”的模块,但似乎已多次导入。我使用pdb在该模块的代码顶部打印堆栈。

这是从第一次执行模块开始的堆栈跟踪的结尾:

File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 328, in refresh  key = cPickle.load(open(key_pkl, ''rb''))File "<anonymized>/ops/TiledConvG3D.py", line 565, in <module>  import TiledConvC3DFile "<anonymized>/ops/TiledConvC3D.py", line 18, in <module>  pdb.traceback.print_stack()

它将继续执行多次。但是,第二次调用的完整堆栈跟踪不会显示对的任何调用reload,因此不应执行这些执行:

File "sup_train_conj_grad.py", line 103, in <module>  dataset = Config.get_dataset(dataset_node)File "<anonymized>/Config.py", line 279, in get_dataset  from datasets import NewWiskottFile "<anonymized>/datasets/NewWiskott.py", line 16, in <module>  normalizer_train = video.ContrastNormalizer3D(sigma, global_per_frame = False, input_is_5d = True)File "<anonymized>/util/video.py", line 204, in __init__  self.f = theano.function([input],output)File "<anonymized>/python_modules/Theano/theano/compile/function.py", line 105, in function  allow_input_downcast=allow_input_downcast)File "<anonymized>/python_modules/Theano/theano/compile/pfunc.py", line 270, in pfunc  accept_inplace=accept_inplace, name=name)File "<anonymized>/python_modules/Theano/theano/compile/function_module.py", line 1105, in orig_function  fn = Maker(inputs, outputs, mode, accept_inplace = accept_inplace).create(defaults)File "/u/goodfeli/python_modules/Theano/theano/compile/function_module.py", line 982, in create  _fn, _i, _o = self.linker.make_thunk(input_storage = input_storage_lists)File "<anonymized>/python_modules/Theano/theano/gof/link.py", line 321, in make_thunk  output_storage = output_storage)[:3]File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 1178, in make_all  output_storage = node_output_storage)File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 774, in make_thunk  cthunk, in_storage, out_storage, error_storage = self.__compile__(input_storage, output_storage)File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 723, in __compile__  output_storage)File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 1037, in cthunk_factory  module = get_module_cache().module_from_key(key=key, fn=self.compile_cmodule)File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 59, in get_module_cache  return cmodule.get_module_cache(config.compiledir)File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 576, in get_module_cache  _module_cache = ModuleCache(dirname, force_fresh=force_fresh)File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 268, in __init__  self.refresh()File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 326, in refresh  key = cPickle.load(open(key_pkl, ''rb''))File "<anonymized>/ops/TiledConvV3D.py", line 504, in <module>  import TiledConvG3DFile "<anonymized>/ops/TiledConvG3D.py", line 565, in <module>  import TiledConvC3DFile "<anonymized>/ops/TiledConvC3D.py", line 22, in <module>  pdb.traceback.print_stack()

此外,我还检查的ID
__builtin__.__import__。在主脚本的开头,我先导入__builtin__并打印,id(__builtin__.__import__)然后再进行其他任何导入。我还id(__builtin__.import__)从被多次导入的模块内部打印,并且id的值不变。

除了调用reload和override之外,还有其他机制__builtin__.__import__可以解释我的模块多次加载吗?

答案1

小编典典

如果在路径中两次找到Python模块,则该模块可以被导入两次。例如,假设您的项目的布局如下:

  • src /
    • 套餐1 /
    • 垃圾邮件
    • eggs.py

假设您的PYTHONPATH(sys.path)包含src和src / package1:

PYTHONPATH=/path/to/src:/path/to/src/package1

在这种情况下,您可以两次导入相同的模块,如下所示:

from package1 import spamimport spam

而且Python会认为它们是不同的模块。那是怎么回事吗?

另外,根据下面的讨论(针对搜索此问题的用户),可以两次导入模块的另一种方法是在第一次导入过程中是否存在异常。例如,如果垃圾邮件导入了鸡蛋,但是导入鸡蛋导致
模块内部 出现异常,则可以再次将其导入。

(任何)python模块的类型提示是什么?

(任何)python模块的类型提示是什么?

我想为模块添加( Python3)类型提示(类’module’).输入包不提供一个,而types.ModuleType()是一个返回特定名称的模块对象的构造函数.

例:

import types
def foo(module: types.ModuleType):
   pass

至少在PyCharm中导致“在types.pyi中找不到参考ModuleType”.

解决方法

and types.ModuleType() is a constructor.

那没关系. types.ModuleType仍然是对类型的引用,就像str和int一样.不需要通用的Module [typehint]注释,因此types.ModuleType非常适合您在这里使用的内容.

例如,官方Python typeshed project提供了type hint annotation for sys.modules

from types import FrameType,ModuleType,TracebackType

# ...

modules: Dict[str,ModuleType]

不要被这里的名字搞糊涂; types.ModuleType是对模块类型的引用.它不是一个单独的工厂功能或其他东西. CamelCase名称遵循该模块的约定,并且您使用该引用,因为类型对象不能作为内置函数使用.类型模块assigns the value of type(sys) to the name.

如果PyCharm在查找types.ModuleType存根时遇到问题,那么这就是PyCharm本身的问题(一个bug),或者当前捆绑的存根是过时的,或者你使用了一个不完整的类型的存根集.请参阅how to use custom stubs上的PyCharm文档以提供新的一套.

如果这不起作用,可能是PyCharm中处理导出类型提示概念的错误.当前defines the ModuleType type hints in a separate module,当前是imported into the types.pyi stubfile,使用from模块导入名称作为名称语法. PEP 484声明导入的类型提示不是存根的一部分,除非您使用as语法:

Modules and variables imported into the stub are not considered exported from the stub unless the import uses the import ... as ... form or the equivalent from ... import ... as ... form.

可能是PyCharm还没有正确处理这种情况.

Python 怎么导入自己写的模块:无法在 Python 中导入我自己的模块

Python 怎么导入自己写的模块:无法在 Python 中导入我自己的模块

OSC 请你来轰趴啦!1028 苏州源创会,一起寻宝 AI 时代

我很难理解模块导入如何在 Python 中工作(我从来没有在任何其他语言之前做过)。

假设我有:

myapp/__init__.py
myapp/myapp/myapp.py
myapp/myapp/SomeObject.py
myapp/tests/TestCase.py

现在我试图得到这样的东西:

myapp.py
===================
from myapp import SomeObject
# stuff ...
TestCase.py
===================
from myapp import SomeObject
# some tests on SomeObject

但是,我肯定做错了什么,因为 Python 看不到 myapp 是一个模块:

ImportError: No module named myapp

在您的特定情况下,它看起来像您正在尝试从 myapp.py 和 TestCase.py 脚本导入 SomeObject。从 myapp.py,执行

import SomeObject

因为它在同一个文件夹中。对于 TestCase.py,请执行

from ..myapp import SomeObject

然而 , 这将工作只有当你从包中导入 TestCase。如果你想直接运行 python TestCase.py, 你将不得不弄乱你的路径。这可以在 Python 中完成:

import sys
sys.path.append("..")
from myapp import SomeObject

虽然这通常是不推荐的。

一般来说,如果你想让其他人使用你的 Python 包,你应该使用 distutils 来创建一个安装脚本。这样,任何人都可以使用像 python setup.py install 这样的命令轻松地安装你的包,它将在他们的机器上随处可见。如果你认真对待这个包,你甚至可以将它添加到 Python 包索引 PyPI 中。

函数 import 将文件查找到您的 PYTHONPATH env. 变量和您的本地目录中。因此,您可以将所有文件放在同一目录中,也可以将路径键入导出到终端:

export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/"

导出路径是一个好方法。另一种方法是将.pth 添加到您的 site-packages 位置。在我的 mac 上,我的 python 将 site-packages 保存在下面显示的 / Library / Python 中

/Library/Python/2.7/site-packages

我在 / Library / Python / 2.7 /site-packages/awesome.pth 创建了一个名为 awesome.pth 的文件,并在该文件中放置以下引用我的真棒模块的路径

/opt/awesome/custom_python_modules

你可以试试

from myapp.myapp import SomeObject

因为您的项目名称与 myapp.py 相同,这使它首先搜索项目文档

python——怎样导入其他地方的python模块

python——怎样导入其他地方的python模块

sys.path是python的搜索模块的路径集,是一个list。

可以在python 环境下使用sys.path.append(path)添加相关的路径,但在退出python环境后自己添加的路径就会自动消失了!

1 临时添加,在一个shell窗口中

 .py文件存放在F:\\python文件夹下


 

 

 使用下面方法将路径永久添加到sys.path:

2 使用pth文件永久添加 

 

使用pth文件,在 site-packages 文件中创建 .pth文件,将模块的路径写进去,一行一个路径,以下是一个示例,pth文件也可以使用注释:

# .pth file for the  my project(这行是注释)

E:\python

E:\python\mysite

E:\python\mysite\polls

这个不失为一个好的方法,但存在管理上的问题,而且不能在不同的python版本中共享

 

 

3 使用PYTHONPATH环境变量

 

使用PYTHONPATH环境变量,在这个环境变量中输入相关的路径,不同的路径之间用逗号(英文的!)分开,如果PYTHONPATH 变量还不存在,可以创建它!



 

路径会自动加入到sys.path中,而且可以在不同的python版本中共享,应该是一样较为方便的方法

要查看当前python环境下所有的pythonpath可以通过os.sys.path来查看

Python从菜鸟到高手(4):导入Python模块

Python从菜鸟到高手(4):导入Python模块

  在Python代码中导入模块需要使用import语句,语法结构如下:

import module_name

  引用模块中函数的语法如下:

module_name.function_name

  如果在Python程序中大量使用模块中的某些函数,那么每次在调用函数时都要加上“模块名”显得有些麻烦,所以在这种情况下,可以使用from…import…语句将模块中的函数直接暴露出来。该语句的语法结构如下:

from module_name import function_name

  如果要想导入模块中的所有函数,可以将function_name替换成型号(*),这样我们就可以直接使用该模块中的所有函数了。

from module_name import *

  另外,import和from…import…语句可以写在Python代码中的任何位置,但一定要在引用相应模块函数之前执行import或from…import…语句,否则调用函数时会抛出异常。

  下面的代码使用import和from…import…语句分别引用了math模块和math模块中的sqrt函数。如果要调用math模块中的其他函数,必须在函数名前加上“math.”前缀,但可以直接调用sqrt函数计算数值的平方根。

print("import和from...import...演示")# 导入math模块import mathprint(math.floor(20.6))# 导入math模块中的sqrt函数from math import sqrtprint(sqrt(12))# 导入math模块中的所有函数from math import *print(sin(3.14/2))

程序运行结果如下图所示。

《Python从菜鸟到高手》已经出版,购买送视频课程


本文分享自微信公众号 - 极客起源(geekculture)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

关于是什么导致python模块两次导入?python的模块导入和重载的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于(任何)python模块的类型提示是什么?、Python 怎么导入自己写的模块:无法在 Python 中导入我自己的模块、python——怎样导入其他地方的python模块、Python从菜鸟到高手(4):导入Python模块的相关知识,请在本站寻找。

本文标签:

上一篇在python数组中排序日期(python中数组排序函数)

下一篇在python 3中查找字符串中单词的出现(在python 3中查找字符串中单词的出现的次数)