我有这样的文件夹结构:

application
├── app
│   └── folder
│       └── file.py
└── app2
    └── some_folder
        └── some_file.py

如何从file.py或some_file.py中导入函数?我尝试了:

from application.app.folder.file import func_name

但它不起作用。


当前回答

以防有人仍然需要解决方案,但在上面的答案中没有找到解决方案。这对我有用:

我有这样的文件夹结构:

a
└── b
    ├── c1
    |   └── d
    |       └── a_script.py
    └── c2
        └── a_lib.py

我需要将a_lib.py包含在a_script.py中。这就是我如何解决c2无法识别的错误:

import sys
from pathlib import Path
path_scripts = Path(__file__).resolve().parents[2]
sys.path.append(str(path_scripts))
from c2 import a_lib

其他回答

没有问题:

from application.app.folder.file import func_name

只需确保文件夹还包含__init__.py,这允许它作为包包含。不知道为什么其他答案都提到了巨蟒。

注:这个答案是针对一个非常具体的问题。对于大多数来自搜索引擎的程序员来说,这不是你想要的答案。通常,您会将文件结构化为包(参见其他答案),而不是修改搜索路径。


默认情况下,您不能。当导入文件时,Python只搜索入口点脚本运行的目录和sys.path,其中包括包安装目录等位置(实际上比这复杂一点,但这涵盖了大多数情况)。

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

    # some_file.py
    import sys
    # caution: path[0] is reserved for script path (or '' in REPL)
    sys.path.insert(1, '/path/to/application/app/folder')

    import file

以防有人仍在寻找解决方案。这对我有用。

Python将包含您启动的脚本的文件夹添加到PYTHONPATH中,因此如果您运行

python application/app2/some_folder/some_file.py

只有文件夹application/app2/some_folder被添加到路径(而不是执行命令的基本目录)。相反,将文件作为模块运行,并在some_folder目录中添加__init__.py。

python -m application.app2.some_folder.some_file

这将把基本目录添加到python路径,然后可以通过非相对导入访问类。

在我的情况下,我有一个类要导入。我的文件如下:

# /opt/path/to/code/log_helper.py
class LogHelper:
    # stuff here

在我的主文件中,我通过以下方式包含了代码:

import sys
sys.path.append("/opt/path/to/code/")
from log_helper import LogHelper

我也面临着同样的挑战,尤其是在导入多个文件时,这就是我如何克服的。

import os, sys

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

from root_folder import file_name