从 Python 中的子文件夹导入

Che*_*nto 5 python import

这就是情况。我正在使用 Python 3.6

我目前有下一个文件夹组织:

/MainProject
  __init__.py
    /Folder1
      pyscript1.py
      pyscript2.py
      __init__.py
    /Folder2
      pyscript3.py
      __init__.py
Run Code Online (Sandbox Code Playgroud)

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

from . import Folder1
Run Code Online (Sandbox Code Playgroud)

给出错误:

ImportError: cannot import name 'Folder1'
Run Code Online (Sandbox Code Playgroud)

我也试过:

from .Utils import script1
Run Code Online (Sandbox Code Playgroud)

给出错误:

ModuleNotFoundError: No module named '__main__.Utils'; '__main__' is not a 
package
Run Code Online (Sandbox Code Playgroud)

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

sys.path.append(os.path.realpath('../..'))
Run Code Online (Sandbox Code Playgroud)

但我想知道不使用 sys.path 是否可行。

ske*_*ipt 6

请注意,这Folder1是一个目录,.py脚本是您的模块。

pyscript3你应该能够去:

from Folder1 import pyscript1
Run Code Online (Sandbox Code Playgroud)

然后您可以访问名称methodname如下的方法:

pyscript1.methodname()
Run Code Online (Sandbox Code Playgroud)

否则,您可以直接导入该方法,例如:

from Folder1.pyscript1 import methodname
Run Code Online (Sandbox Code Playgroud)

并使用它:

methodname()
Run Code Online (Sandbox Code Playgroud)

编辑:

为了让您的程序看到Folder1Folder2,您需要从MainProject文件夹中运行您的程序。

移动pyscript3到您的MainFolder或编写另一个脚本,让我们调用它main.py,并调用必要的代码来实例化类/调用您想要的函数pyscript3.py

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