【问题标题】:Appending user-defined modules for automatic searching附加用户定义的模块以进行自动搜索
【发布时间】:2022-01-17 19:38:15
【问题描述】:

我在 Windows 的 site-packages 目录中创建了我自己的目录并放置了一些 Python 文件。

我可以导入它们只命名模块还是我需要做一些额外的操作来使目录和模块可见?

【问题讨论】:

  • Python 文档:The Module Search Path
  • @ekhumoro 这是一个无用的参考,因为阅读提供的文本仍然不清楚如何添加用户定义的模块。似乎为 Python 编写文档的人无法使用人类语言。
  • 链接的文档确实回答了您的问题(因为它目前是写的)。如果您有更具体的要求,请编辑您的问题并添加相关详细信息。 (注意:要更一般地理解 Python 导入的工作原理,请参阅 Python 文档:Packages)。
  • @ekhumoro 这是一个非常糟糕的文档。

标签: python import module


【解决方案1】:

是的,如果它们位于 site-packages 目录中,您应该能够导入它们。话虽这么说:文档声明这是“按照惯例”并且取决于安装;这似乎意味着在特定的安装中可能不是这种情况,我想?

更广泛地说,如果它们位于sys.path 中的任何目录中,您应该能够导入它们,并且site-packages 目录通常(按照约定等)默认情况下是其中的一部分,如前所述。您还可以通过修改 PYTHONPATH 环境变量“永久”添加自定义目录。

根据 OP 的说明进行编辑:
如果您在site-packages 中有一个目录a,并且在该目录中您有模块b,那么导入它的语法将是import a.b,或from a.b import *
为了启用import b/from b import * 语法,您需要将该文件放在sys.path 中任何目录的基目录中。因此,例如,将模块b 直接放在site-packages 中,而不是放在a 目录中;或者通过将b 所在的目录(例如a)添加到sys.path 中。这可以通过在脚本本身中动态修改 sys.path 来实现,或者通过修改 PYTHONPATH 环境变量以包含该目录来“永久”地修改,如上所述。

【讨论】:

  • 目前还不清楚我是否会将模块放置在 site-packages 目录的子目录中——它们是否可见?
  • 啊;你的意思是,例如,如果你在site-packages 中有一个名为a 的目录,然后是另外几个目录a/inner1a/inner2 等,它们本身就是模块?如果是这样,那么应该可以使用import a.nested1import a.nested2 等访问“内部”模块(子目录)(这同样适用于您的sys.path 中的每个目录。)
  • 如果您希望这些模块可以直接访问(没有前面的a),那么您可能真正想要的是添加一个“自定义站点包”正如我所提到的,您自己的模块可以添加到您的 PYTHONPATH 中。我希望我能正确理解您的要求。
  • 我的意思如下。例如,我在目录 site-packages 目录 a 中创建了一个模块 b.py。写 from b import * 就够了吗?
  • 不:它必须是from a.b import *。如果您希望它只是 from b import *,则需要将 b.py 放在 site-packages 本身中,或者将 b.py 所在的目录添加到您的 PYTHONPATH(或 sys.path)中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 2018-10-16
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
相关资源
最近更新 更多