从其他文件夹导入文件

我有以下文件夹结构。

application/app/folder/file.py

我想从位于另一个 Python 文件中的file.py导入一些功能

application/app2/some_folder/some_file.py

我试过了

from application.app.folder.file import func_name

和其他一些尝试,但到目前为止,我无法正确导入。我怎样才能做到这一点?

答案

默认情况下,您不能这样做。导入文件时,Python 仅搜索当前目录,入口点脚本运行所在的目录以及sys.path ,其中包括诸如软件包安装目录之类的位置(实际上比这稍微复杂一点,但这涵盖了在大多数情况下)。

但是,您可以在运行时添加到 Python 路径:

# some_file.py
import sys
# insert at 1, 0 is the script path (or '' in REPL)
sys.path.insert(1, '/path/to/application/app/folder')

import file

没错:

from application.app.folder.file import func_name

只要确保folder还包含__init__.py ,就可以将其作为软件包包含在内。不知道为什么其他答案谈论PYTHONPATH

当模块处于并行位置时,如下所示:

application/app2/some_folder/some_file.py
application/app2/another_folder/another_file.py

该简写使一个模块对另一模块可见:

import sys
sys.path.append('../')

我认为,一种临时方法是按照文档中所述使用环境变量PYTHONPATHPython2Python3

# Linux & OSX
export PYTHONPATH=$HOME/dirWithScripts/:$PYTHONPATH

# Windows
set PYTHONPATH=C:\path\to\dirWithScripts\;%PYTHONPATH%

首次导入系统

import sys

第二追加文件夹路径

sys.path.insert(0, '/the/folder/path/name-folder/')

第三步在子目录中创建一个名为__ init __.py 的空白文件(这告诉 Python 它是一个模块)

  • 名称文件
  • 名称文件夹
    • __初始化__.py
    • 名称模块

第四步将模块导入文件夹中

from name-folder import name-module

您的问题是 Python 正在 Python 目录中查找此文件,但找不到它。您必须指定所谈论的目录是您所在的目录,而不是 Python 目录。

为此,您可以更改以下内容:

from application.app.folder.file import func_name

对此:

from .application.app.folder.file import func_name

通过添加点,您说的是在此文件夹中查找应用程序文件夹,而不是在 Python 目录中查找。

答案不够明确,已在 Python 3.6 上进行了测试

使用此文件夹结构:

main.py
|
---- myfolder/myfile.py

myfile.py包含以下内容:

def myfunc():
    print('hello')

main.py的 import 语句是:

from myfolder.myfile import myfunc
myfunc()

这将打印你好

据我所知,直接在要导入的函数的文件夹中添加__init__.py文件即可完成此工作。

在 Linux 上的 python3 中为我工作

import sys  
sys.path.append(pathToFolderContainingScripts)  
from scriptName import functionName #scriptName without .py extension

我面临着同样的挑战,尤其是在导入多个文件时,这就是我设法克服的方式。

import os, sys

from os.path import dirname, join, abspath
sys.path.insert(0, abspath(join(dirname(__file__), '..')))

from root_folder import file_name