我有这样的文件夹结构:

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

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

from application.app.folder.file import func_name

但它不起作用。


当前回答

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

操作系统: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())

这里的答案不够清晰,这是在Python 3.6上测试的

使用此文件夹结构:

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

其中myfile.py包含内容:

def myfunc():
    print('hello')

main.py中的import语句是:

from myfolder.myfile import myfunc
myfunc()

这将打印hello。

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

# /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

这对我在窗户上有用

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

import some_file

我已经多次遇到这些问题。我已经多次来到同一页。在我的上一个问题中,我必须从固定目录运行服务器,但每当调试时,我都希望从不同的子目录运行。

import sys
sys.insert(1, /path) 

不适合我,因为在不同的模块中,我必须读取不同的*.csv文件,这些文件都在同一目录中。

最后,我想对我有用的不是蟒蛇,而是:

我在要调试的模块上使用了if __main__,它从不同于通常的路径运行。

So:

# On top of the module, instead of on the bottom
import os
if __name__ == '__main__':
    os.chdir('/path/for/the/regularly/run/directory')