尽管尝试了多个建议,但无法在 Python 中导入本地模块
Cannot import local module in Python despite trying multiple suggestions
我已经通读了大约 10 post 篇关于如何导入本地模块的文章,但我仍然对为什么这不起作用感到困惑。我有一个非常简单的模块,actor.py,里面只有一个 class:
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
所以我再次搜索, post 告诉我从 'actor,' 中删除点,但如前所述,我也试过了。我最后的猜测是
from . import actor
但这会产生
ImportError: cannot import name 'actor'
我遵循 here,但那里的答案提到了循环依赖,我确定 actor 和 scraper 有 none。我可能没有正确编写我的模块吗?我想不出任何其他方式来编写导入语句。
编辑:如果有帮助的话,我正在使用 Intellij
要将 class 导入您的脚本,请使用:
from actor import Actor
或者将 .py 完全导入(包括其中包含的任何导入)到命名空间中使用:
from actor import *
尝试from WebScraper.actor import Actor
。如果这不起作用,那是因为您的包目录不在 PYTHONPATH
中。您可以在 IntelliJ Python run configuration.
中设置
相对导入对您不起作用,因为您正试图 运行 将模块作为脚本。您可以在 看到对正在发生的事情的解释。如果你想让相对导入工作,你必须添加一个 __main__.py
文件到你的模块以允许它 运行nable,或者从一个你使用绝对导入的外部脚本执行,这样你就不会'破坏包命名空间。
另一个文体注释- 通常(但不总是)python 中的包名称使用所有小写名称。 CamelCase 保留用于 class 个名称。因此,如果您想遵循约定,您可以调用您的包 webscraper
并使用 from webscraper.actor import Actor
我已经通读了大约 10 post 篇关于如何导入本地模块的文章,但我仍然对为什么这不起作用感到困惑。我有一个非常简单的模块,actor.py,里面只有一个 class:
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
所以我再次搜索,
from . import actor
但这会产生
ImportError: cannot import name 'actor'
我遵循 here,但那里的答案提到了循环依赖,我确定 actor 和 scraper 有 none。我可能没有正确编写我的模块吗?我想不出任何其他方式来编写导入语句。
编辑:如果有帮助的话,我正在使用 Intellij
要将 class 导入您的脚本,请使用:
from actor import Actor
或者将 .py 完全导入(包括其中包含的任何导入)到命名空间中使用:
from actor import *
尝试from WebScraper.actor import Actor
。如果这不起作用,那是因为您的包目录不在 PYTHONPATH
中。您可以在 IntelliJ Python run configuration.
相对导入对您不起作用,因为您正试图 运行 将模块作为脚本。您可以在 看到对正在发生的事情的解释。如果你想让相对导入工作,你必须添加一个 __main__.py
文件到你的模块以允许它 运行nable,或者从一个你使用绝对导入的外部脚本执行,这样你就不会'破坏包命名空间。
另一个文体注释- 通常(但不总是)python 中的包名称使用所有小写名称。 CamelCase 保留用于 class 个名称。因此,如果您想遵循约定,您可以调用您的包 webscraper
并使用 from webscraper.actor import Actor