我有这样的文件夹结构:

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

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

from application.app.folder.file import func_name

但它不起作用。


当前回答

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

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路径,然后可以通过非相对导入访问类。

其他回答

我通常会创建一个指向要导入的模块的符号链接。符号链接确保Python解释器可以在当前目录(将其他模块导入的脚本)中找到模块;稍后工作结束后,可以删除符号链接。此外,您应该忽略.gitignore中的符号链接,这样就不会意外地将符号链接模块提交到repo中。这种方法甚至可以让您成功地处理与正在执行的脚本并行的模块。

ln -s ~/path/to/original/module/my_module ~/symlink/inside/the/destination/directory/my_module

这对我在窗户上有用

# some_file.py on mainApp/app2 
import sys
sys.path.insert(0, sys.path[0]+'\\app2')

import some_file

哇,我没想到会花这么多时间在这上面。以下内容对我有用:

操作系统:Windows 10

Python:v3.10.0

注意:由于我是Python v3.10.0,所以我没有使用__init__.py文件,这对我来说无论如何都不起作用。

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

王旭的第一个解决方案对我有效。为了清楚起见,我将其转发了一个绝对的文件参考:

import sys
sys.path.insert(1, 'C:\\Users\\<Your Username>\\application')
import app2.some_folder.some_file

some_file.hello_world()

替代解决方案:然而,这也对我有效:

import sys
sys.path.append( '.' )
import app2.some_folder.some_file

some_file.hello_world()

虽然,我不明白为什么它会起作用。我以为点是对当前目录的引用。但是,当打印出当前文件夹的路径时,当前目录已列在顶部:

for path in sys.path:
    print(path)

希望有人能在评论中澄清为什么这样做有效。尽管如此,我也希望它能帮助一些人。

如果您只想运行脚本而不是实际导入脚本,则exec命令将执行此操作

exec(open('/full/or/relative/path').read())

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

我有这样的文件夹结构:

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