【问题标题】:Python module import containing . and _Python 模块导入包含 .和 _
【发布时间】:2020-06-30 13:06:09
【问题描述】:

问题: 我想将一个模块(名称:Ex3.2_myModule)导入一个文件(名称:Ex3.2_Test.py)。它们在同一个目录中。为此,我尝试了在有关该主题的其他几个讨论中提出的几个选项(即屏幕截图)(即Discussion 1Discussion 2)。它们都不起作用。

截图:1https://i.stack.imgur.com/GnFQg.png

问题:如何在不更改模块名称的情况下导入此模块?

代码

Ex3.2_Test.py

# 1
import Ex3.2_myModule as mm

#2
mm = __import__("Ex3.2_myModule")

#3
import importlib
mod = importlib.import_module("Ex3.2_myModule")


mm.helloWorld()

Ex3.2_myModule.py

def helloWorld():
    print("Hello, World")

解决方案Discussion 2 中提出的解决方案毕竟有效。非常感谢@a_guest 指出!

【问题讨论】:

  • 能否请您在帖子中提供代码,而不是在屏幕截图中。
  • “将模块导入文件”是什么意思?如果您打算文件导入模块,则必须更改文件名,或使用importlib 模块。 import 语句将 . 视为将包名称与包含的模块名称分开,而不是作为单个模块名称的一部分。
  • @tjallo:感谢您的意见!
  • @chepner:可能是一个愚蠢的问题,但 Ex3.2_Test.py 不是我导入模块的文件吗?
  • 这能回答你的问题吗? How to import a module given the full path?

标签: python python-import


【解决方案1】:

情况很棘手,因为点表示 python 的子包结构。无论如何,小鬼还是有可能的:

import imp
mm = imp.load_source('mm', 'Ex3.2_myModule.py')

mm.helloWorld()

注意:这是非正统的,建议您简单地重命名您的模块。

鉴于这可能是为了练习,您应该重命名您的模块。

【讨论】:

  • imp 模块自 Python 3.4 起已弃用。
  • 不幸的是,这对我不起作用。我应该在哪里发布这给我的错误?
  • @Pewepow 这是为了某种(学校)运动吗? (因为命名Ex3.2)如果是这样,请更改名称。如果他们让您对名称更改感到困难,只需向他们解释模块中的小数点是用于子包的。在您的模块名称中使用它们是不正确的,而且是不符合标准的,这是一种不好的做法。如果他们给你带来困难,他们实际上是在教你不好的做法。我知道这不是你问题的答案。但我认为这是您问题的答案! ;)
  • @tjallo 你是对的。这是不好的做法,我将更改文件名。但是,我仍然想知道是否有办法让它与当前名称一起使用。我不得不承认我可能有点固执:)
【解决方案2】:

https://stackoverflow.com/a/43602557/5386938 窃取的以下内容在我的机器上工作

from importlib.util import spec_from_loader, module_from_spec
from importlib.machinery import SourceFileLoader 

spec = spec_from_loader("Ex3.2_myModule", SourceFileLoader("Ex3.2_myModule", ".\\Ex3.2_myModule.py"))
mm = module_from_spec(spec)
spec.loader.exec_module(mm)

mm.hello()
help(mm)

Ex3.2_myModule.py 的内容在哪里

def hello():
    print('Hello, World!')

【讨论】:

    【解决方案3】:
    import imp
    with open('Ex3.2_myModule.py', 'rb') as fp:
        mm = imp.load_module('models_admin', fp, 'models.admin.py', ('.py', 'rb', imp.PY_SOURCE) )
    mm.helloWorld()
    

    【讨论】:

      猜你喜欢
      • 2013-02-21
      • 1970-01-01
      • 2021-10-13
      • 2023-04-06
      • 2020-08-27
      • 2017-02-25
      • 2012-12-24
      • 2016-07-30
      • 2020-01-30
      相关资源
      最近更新 更多