我有这样的文件夹结构:

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 3.6上测试的

使用此文件夹结构:

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

其中myfile.py包含内容:

def myfunc():
    print('hello')

main.py中的import语句是:

from myfolder.myfile import myfunc
myfunc()

这将打印hello。

其他回答

下面的代码以Python版本安全的方式导入由路径给定的Python脚本,无论它位于何处:

def import_module_by_path(path):
    name = os.path.splitext(os.path.basename(path))[0]
    if sys.version_info[0] == 2:   
        # Python 2
        import imp
        return imp.load_source(name, path)
    elif sys.version_info[:2] <= (3, 4):  
        # Python 3, version <= 3.4
        from importlib.machinery import SourceFileLoader
        return SourceFileLoader(name, path).load_module()
    else:                            
        # Python 3, after 3.4
        import importlib.util
        spec = importlib.util.spec_from_file_location(name, path)
        mod = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(mod)
        return mod

我在psutils.test.__init__.py的第1042行psutils代码库中发现了这一点(最新提交时间为2020年10月9日)。

用法示例:

script = "/home/username/Documents/some_script.py"
some_module = import_module_by_path(script)
print(some_module.foo())

重要警告:该模块将被视为顶级模块;从父包中的任何相对导入都将失败。

当模块位于平行位置时,如问题所示:

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

这种速记使一个模块对另一个模块可见:

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

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

您可以使用importlib导入模块,其中您希望使用如下字符串从文件夹中导入模块:

import importlib

scriptName = 'Snake'

script = importlib.import_module('Scripts\\.%s' % scriptName)

这个示例有一个main.py,它是上面的代码,然后是一个名为Scripts的文件夹,然后您可以通过更改scriptName变量从这个文件夹中调用所需的任何内容。然后可以使用脚本引用此模块。例如,如果我在Snake模块中有一个名为Hello()的函数,您可以通过这样做来运行该函数:

script.Hello()

我已经在Python 3.6中测试过了

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

我有这样的文件夹结构:

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