尽管尝试了多个建议,但无法在 Python 中导入本地模块
Posted
技术标签:
【中文标题】尽管尝试了多个建议,但无法在 Python 中导入本地模块【英文标题】:Cannot import local module in Python despite trying multiple suggestions 【发布时间】:2018-08-04 21:38:06 【问题描述】:我已经阅读了大约十篇关于如何导入本地模块的帖子,但我仍然不明白为什么这不起作用。我有一个非常简单的模块,actor.py,里面只有一个类:
class Actor(object):
def __init__(self, name, age):
self.name = name
self.age = age
我正在尝试将它导入到同一目录中的另一个模块 scraper.py 中:
一些修复程序已将没有 init.py 列为本地导入的问题,所以我知道这不是我的问题。 最初我尝试了这些:
import actor
和
from actor import Actor
但它告诉我 actor 和 Actor 是未解析的引用。 here 告诉我这是 Python 2 语法,而我正在使用 Python 3。这个答案建议我这样做:
from .actor import Actor
当我使用该语法运行程序时,出现以下错误:
ModuleNotFoundError: No module named '__main__.actor'; '__main__' is not a package
所以我再次搜索,this 帖子告诉我删除“演员”中的点,但如前所述,我也尝试过。我的最终猜测是
from . import actor
但这会产生
ImportError: cannot import name 'actor'
我关注here,但那里的答案提到了循环依赖,我敢肯定演员和刮刀没有。我可能没有正确编写我的模块吗?我想不出任何其他方法来编写导入语句。
编辑:如果它有帮助,我正在使用 Intellij
【问题讨论】:
你想如何运行它?'__main__' is not a package
表明您的执行方式存在问题。
应该是:from actor import Actor
,您从同一目录中的文件导入类。
@avigil 我在 scraper.py 中运行 main 方法。
所以python -m WebScraper.scraper
?如果它是模块的一部分,则不能使用 python scraper.py
直接调用它。
或者如果你在 IntelliJ 中运行,这是你的 IDE 运行配置的问题,而不是代码本身。
【参考方案1】:
试试from WebScraper.actor import Actor
。如果这不起作用,是因为您的包目录不在PYTHONPATH
中。你可以在IntelliJ Python run configuration中设置。
相对导入对您不起作用,因为您试图将模块作为脚本运行。您可以在 https://***.com/a/8300343/7088038 看到对正在发生的事情的解释。如果您希望相对导入起作用,您必须将__main__.py
文件添加到您的模块以使其可运行,或者从使用绝对导入的外部脚本执行,这样您就不会破坏包命名空间。
另一种风格说明 - 通常(但不总是)python 中的包名称使用全小写名称。 CamelCase 保留用于类名。因此,如果您想遵循约定,您可以调用您的包webscraper
并使用from webscraper.actor import Actor
【讨论】:
【参考方案2】:要将类导入脚本,请使用:
from actor import Actor
或者将 .py 完全导入(包括其中包含的任何导入)到命名空间使用:
from actor import *
【讨论】:
如果你浏览我的帖子,你会发现我已经尝试过了,但没有成功 我确实看到了,但我尝试了它并且它有效。我错过了什么吗? 如果我执行“从 actor 导入 Actor”,它会告诉我 actor 是一个未解析的引用,因此仅此一项不是解决方案 我会在我的原始帖子中说明它不起作用的原因 可能用于在类定义中使用(Object)
。 python3 中的新语法消除了这一点。以上是关于尽管尝试了多个建议,但无法在 Python 中导入本地模块的主要内容,如果未能解决你的问题,请参考以下文章
cx_Oracle 无法在 Python 3.9 中导入,尽管一切都已正确路径并且所有必需的部分都在 64 位上运行
为什么我不能在我的Jupyter Notebook(Python 3.6)中导入utils,尽管它已经安装了?
如何在 Pandas Dataframe 中导入多个 excel 文件