【问题标题】:What is Python looking for when it tries to "import"?当 Python 尝试“导入”时,它在寻找什么?
【发布时间】:2019-04-01 19:50:07
【问题描述】:

想象一些假设的 Python 代码:

from turboencabulator import panametricfan

如果我尝试在我的计算机(Windows、64 位、Windows 10)上运行它,它无法找到 turboencabulator 模块:

它在寻找什么?

当 Python 试图加载一个模块时,它在寻找什么?它是.py 文件吗?是.dll(因为这是Windows)。是文件夹吗?

Windows 有模块;它们被称为组件

Windows 有程序集 的概念。如果您声明要使用名为 turboencabulator 的程序集,它将查找 程序集清单

  • turboencabulator.manifest

您还可以创建一个名为turboencabulator文件夹,它会在其中查找组装清单:

turboencabulator
|--- turboencabulator.manifest 

然后,该清单将依次声明构成该程序集的所有文件。

例如,如果我需要使用 Microsoft Visual C Runtime 8.0,我会声明对模块的依赖

Microsoft.VC80.CRT

然后Windows会去寻找:

  1. Microsoft.VC80.CRT.manifest 文件夹中的文件
  2. Microsoft.VC80.CRT 文件夹
    • 其中必须包含Microsoft.VC80.CRT.manifest
  3. 其他一些地方(比如WinSxS,也许是路径,谁知道)

然后清单只是一个文本文件,让您知道 msvcrt 由 3 个 dll 组成:

  • <file name="msvcr80.dll" />
  • <file name="msvcp80.dll" />
  • <file name="msvcm80.dll" />

python 在寻找什么?

当我指定我想导入一个模块时:

from RetroEncabulator import GirdleSpring

python 在寻找什么

  • 二进制文件?
  • 拉链?
  • 是否是已在注册表中注册的命名项?
  • 声明组成模块的所有文件的模块清单文件的名称?

python 到底在寻找什么

额外问题

  • 它看起来在哪里
  • 是否可以配置为查找地点
  • 模块可以在某处注册,所以它没有去打猎吗? (正如正确编写的 Windows 应用程序应该做的那样)

奖金聊天

  • 实际上我是from numpy
  • 实际上我是from cntk

这些“东西”都没有“找到”

阅读奖励

额外调查

为了对比目前为止的异端说法,我决定实际监视 python 以查看它的用途和寻找:

  • HKEY_CURRENT_USER/Software/Python/PythonCore/2.7/Modules/turboencabulator
  • HKEY_LOCAL_MACHINE/Software/Python/PythonCore/2.7/Modules/turboencabulator
  • D:\DevelopPy\Bunny\turboencabulator
  • D:\DevelopPy\Bunny\turboencabulator.pyd
  • D:\DevelopPy\Bunny\turboencabulator.py
  • D:\DevelopPy\Bunny\turboencabulator.pyw
  • D:\DevelopPy\Bunny\turboencabulator.pyc
  • D:\Programs\Python27\DLLs\turboencabulator
  • D:\Programs\Python27\Lib\turboencabulator
  • D:\Programs\Python27\Lib\site-packages\turboencabulator

我在注册表中看到它。是不是就可以注册了?
我看到它正在寻找除了pypycpywpyd)之外的文件。那些是编译好的吗?
我在Python\DLLs 文件夹中看到它。这是否意味着可以有 DLL?
我在Lib 中看到它?那些是用于中间对象二进制文件的吗?

【问题讨论】:

  • 猜这会是自我回答?无论如何:这个问题是特定于 Windows 的吗?
  • 我不明白这个漫无边际的问题的目的是什么。最后的链接似乎正是它所要求的那种教程,但 Stack Overflow 并不是一个首先要求提供教程链接的地方。
  • 不,你为什么会这么认为?你做过任何基本的 Python 教程吗?任何 python 文件都是一个模块。
  • 但是你自己的链接告诉你。不读就发帖有什么意义?
  • 第二段:“简单来说,模块就是由 Python 代码组成的文件。”

标签: python windows


【解决方案1】:

当您在代码中包含import 语句时,python 会尝试按照以下顺序查找包含__init__.py 文件的python 文件包目录 p>

  1. 当前工作目录
  2. 本地用户站点包
  3. 常用站点包

可以通过以下代码查看路径

import sys
print(sys.path)

您也可以添加自己的路径。

注意:您必须在导入其他模块之前添加此行

import sys
sys.path.append("your/complete/path/to/directory")

【讨论】:

  • 它在寻找什么 python 文件?它是否在寻找turboencabulator.py?它去寻找什么包目录?它是否在寻找turboencabulator?这是否意味着python中的模块不是编译好的二进制文件?
  • 你看到 sys.path 的输出了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 2013-11-10
  • 2018-02-28
  • 2022-12-07
  • 1970-01-01
  • 2017-11-26
相关资源
最近更新 更多