【问题标题】:Is an import in python considered to be dynamic linking?python中的导入是否被认为是动态链接?
【发布时间】:2016-11-08 17:01:53
【问题描述】:

用 posix 和通用技术软件开发的说法。纯 python(不是 cython 或 c 编译库)模块的 import 是否构成动态链接?

【问题讨论】:

  • 另外,关于LGPL,它是否被视为动态链接?我相信会,但是 IANAL。
  • 是和否取决于“动态链接”的定义。在通常的意义上no,动态链接只是关于编译程序(例如 ELF 可执行文件)的链接,而不是脚本。
  • 我对此不太感兴趣,因为我确信关于 LGPL 是指 c 样式链接还是完全不同的东西存在争议。

标签: python python-2.7 python-3.x python-import dynamic-linking


【解决方案1】:

不,加载纯 Python 模块不被视为一种动态链接形式。

传统的动态链接将机器代码加载到新的内存块中,并且可以授予多个可执行进程访问权限(动态链接库只需要加载一次,其余的由虚拟内存处理)。链接器在运行时连接可执行文件和动态库。

另一方面,加载 Python 模块会将模块的字节码加载到 Python 进程本身(如果此时也没有可用的字节码缓存,Python 将编译源代码)。加载的模块在进程之间不共享。无需进行翻译,运行字节码的结果会在 Python 堆中生成新对象,解释器中的所有现有代码都可以与之交互。

这个过程不涉及链接器,没有单独的内存,对于操作系统来说,没有单独的内存部分需要管理,因为模块只是 Python 进程内存的一部分。

【讨论】:

  • 谢谢。另一方面,在 Python 中“加载 Python 模块”是指 import 语句还是 __import__() 内置函数,或者两者兼而有之,如 stackoverflow.com/questions/28231738/…
  • @Tim: 两者,import 语句使用__import__() 钩子来完成它的工作。
  • 谢谢。 import 语句和__import__() 函数都属于en.wikipedia.org/wiki/Dynamic_loading 还是en.wikipedia.org/wiki/Dynamic_linking?如果两者都不是,它们属于什么,或者它们更接近哪一个?
  • 两者都不是。 Python 没有使用操作系统级别的库共享来加载字节码数据。从操作系统的角度来看,Python 模块只是数据文件。
  • 谢谢。如果我们概括从操作系统到 Python 解释器或虚拟机的动态加载和动态链接的概念会怎样? import 语句和 __import__() 函数都属于广义的“动态加载”还是广义的“动态链接”?如果两者都不是,它们属于什么,或者它们更接近哪一个?
猜你喜欢
  • 2011-06-15
  • 1970-01-01
  • 2015-07-24
  • 2020-04-30
  • 2015-10-29
  • 1970-01-01
  • 2014-11-28
  • 2015-08-26
  • 2018-05-28
相关资源
最近更新 更多