【问题标题】:Python can't run script inside packagePython 无法在包内运行脚本
【发布时间】:2021-02-26 18:35:36
【问题描述】:

我认为问题在于运行代码未导入,因为 IntelliCode 可以识别模块和函数

这是我的文件结构

-a.py
-tests/
      -__init__.py
      -b.py
-pages/
      -__init__.py
      -c.py

这里是 c.py

from tests import b


def hello_from_c():
    print('C says hi')

这里是 b.py

import pages.c as c

c.hello_from_c()

当我在终端中运行“python a.py”并导入 b 或 c 时,它运行良好。 但是,当我在终端中将 c 或 b 作为脚本运行时,尝试导入另一个文件时,我得到“没有名为测试的模块”或“没有名为页面的模块”。即使 IntelliCode 没有显示任何错误。

发生这种情况的原因是什么?

(更新) 运行python -m [packagename].[filename(no .py)] 工作

【问题讨论】:

  • import ..tests?
  • 不,它可以识别导入,因为我可以调用函数。就在我在终端中运行它时,我得到了错误
  • 不确定你的意思。我假设您在 c.py 内有 import tests 或在 b.py 内有 import pages
  • 请发布您的实际代码。
  • 我在那里添加了代码,它似乎没有问题只在运行时导入它

标签: python file terminal module package


【解决方案1】:

当您运行python a.py 时,python 会搜索与a.py 所在地址相关的模块,在您的示例中是根地址。这就是为什么您可以使用tests.bpages.c 导入b.pyc.py,无论导入代码在哪个文件中(无论是a.pyb.py 还是c.py)。

但是,当您运行b.pyc.py 时,python 的模块搜索范围是相对于这些文件所在的地址的。因此,当您运行b.py 时,它会在@ 中查找pages 文件夹987654335@文件夹,显然不存在。

即使您尝试使用..,您也会收到ValueError: Attempted relative import in non-package。如果你真的想从同级目录中的另一个 python 文件中导入一些东西,我建议你阅读这个帖子:

How to fix "Attempted relative import in non-package" even with __init__.py

【讨论】:

    猜你喜欢
    • 2021-05-06
    • 2015-11-30
    • 1970-01-01
    • 2013-01-24
    • 2016-03-06
    • 2017-12-25
    • 2020-09-22
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多