Python中从子文件夹导入的方法

6
这是情况。我正在使用Python 3.6
我目前有以下文件夹组织:
/MainProject
  __init__.py
    /Folder1
      pyscript1.py
      pyscript2.py
      __init__.py
    /Folder2
      pyscript3.py
      __init__.py

因此,我正在尝试从pyscript3中获取存在于pyscript1.py中的函数。我还在每个级别上添加了init.py。在pyscript3.py内,我尝试了以下操作:

from . import Folder1

报错信息如下:

ImportError: cannot import name 'Folder1'

我尝试了以下方法:

from .Utils import script1

给出错误信息:
ModuleNotFoundError: No module named '__main__.Utils'; '__main__' is not a 
package

我知道可以使用sys和os以下方式来解决它:

sys.path.append(os.path.realpath('../..'))

但我想知道是否可以不使用sys来实现这个功能。

3个回答

9
请注意,Folder1 是一个目录,而 .py 脚本则是你的模块。
pyscript3 中,您应该能够执行以下操作:
from Folder1 import pyscript1

然后,您可以像这样访问名为 methodname 的方法:

pyscript1.methodname()

否则,您可以直接导入该方法,例如:
from Folder1.pyscript1 import methodname

并且像这样使用:

methodname()

编辑:

如果您的程序要看到Folder1Folder2,则需要从MainProject文件夹运行您的程序。

要么将pyscript3移动到您的MainFolder中,要么编写另一个脚本,我们称其为main.py,并调用必要的代码来实例化类/调用您想要在pyscript3.py中使用的函数。

总之,您始终希望从项目的基本文件夹中运行入口模块。


1
这是我评论的问题,我收到了ModuleNotFoundError:没有名为'Folder1'的模块。 - Chema Sarmiento
你不能导入Folder1,但是你可以从Folder1导入一个脚本。你能详细说明一下你的MainProject文件夹吗?入口在哪里? - alecvn
我正在尝试从pyscript3转到pyscript1,入口点将是pyscript3。 - Chema Sarmiento
你可以展示一下你的 main.py 或者等效文件吗?大概是在 MainProject 文件夹里面吧? - alecvn
还有,你是怎么运行程序的呢?简单地使用python main.py命令吗? - alecvn
显示剩余3条评论

0
如果仍然无法正常工作,请检查您为项目定义的PYTHONPATH环境变量。有时候,一个人只为项目的根文件夹定义了PYTHONPATH,但是希望从已定义的PYTHONPATH内部的文件夹导入模块。
解决此问题的选项如下:
  1. 通过添加父文件夹名称来导入模块,例如:import MainProject.Folder1.pyscript1而不是import Folder1.pyscript1
  2. 为您要导入模块的子文件夹添加另一个PYTHONPATH。

-1
你可以使用以下代码在pyscript3.py中导入pyscript1: from ..Folder1 import pyscript1 但是你必须从父模块或者在你的情况下是MainProject中加载pyscript3。

这是两个级别以上的问题,不起作用,我无法从父模块加载pyscript3,即使我使用..Folder1,也会出现以下错误:ValueError: attempted relative import beyond top-level package。 - Chema Sarmiento

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接