【问题标题】:Simple case of __init__.py and import giving mysterious module not found__init__.py 的简单案例和未找到神秘模块的导入
【发布时间】:2020-06-13 23:27:58
【问题描述】:

我从很多不同的角度尝试过,但无法解决。一定是这么简单的案例。在 Python 3.7.6 中:

目录结构:

./modtest/
./modtest/__init__.py
./modtest/test1.py
./modtest/test2.py

test1.py:

import modtest
def x(i):
   print(i)
   y(i)    

test2.py:

def y(i):
   print(i)

__init__.py 是一个空文件。

当我尝试运行代码时:

$ /Users/pitosalas/miniconda3/bin/python /Users/pitosalas/mydev/rsb_py/modtest/test1.py
Traceback (most recent call last):
  File "/Users/pitosalas/mydev/rsb_py/modtest/test1.py", line 1, in <module>
    import modtest
ModuleNotFoundError: No module named 'modtest

根据我的阅读,这应该有效。我敢肯定有什么小问题!

【问题讨论】:

  • 如果你在__init__.py 中放任何东西——比如评论,它会起作用吗?
  • 在你的命令行中,当你运行test1.py 时,并不清楚当前的工作目录是什么。要使modtest 在Python 搜索路径中,您可能需要从父目录(包含modtest 目录的目录)运行。
  • @Blckknght 所以问题是我在运行 python xxx 时所在的目录而不是文件本身所在的目录?
  • 为什么需要导入modtest?在您给出的示例中,它甚至没有使用。
  • @wjandrea 对.. 错字。让我解决。

标签: python python-3.x python-import


【解决方案1】:

您正在将modtest 导入test1.py,而此模块本身位于modtest 中。这不可能是因为 modest 尚未定义并添加到搜索路径中。所以这实际上是你应该拥有的:

./modtest/
./modtest/__init__.py
./modtest/
./modtest/test2.py
./test1.py  # this module must be outside of modtest

【讨论】:

  • 所以关键是外部“包”的名称(正确的术语?)内部的代码不知道。并且在同一个包中导入另一个模块(file.py)不能由包名限定...?
  • 这是不对的。您绝对可以从导入包的其他部分的包中运行文件。使用python package/module.py 可能是个坏主意,python -m package.module 更好。但它确实有效。
  • @blckknght 你能通过 package/module.py 和 python -m ... 等解释一下你的 Nena 吗?
猜你喜欢
  • 2016-06-14
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 2013-04-21
  • 2013-07-29
  • 2019-05-29
  • 2018-01-28
相关资源
最近更新 更多