我有这样的文件夹结构:
application
├── app
│ └── folder
│ └── file.py
└── app2
└── some_folder
└── some_file.py
如何从file.py或some_file.py中导入函数?我尝试了:
from application.app.folder.file import func_name
但它不起作用。
我有这样的文件夹结构:
application
├── app
│ └── folder
│ └── file.py
└── app2
└── some_folder
└── some_file.py
如何从file.py或some_file.py中导入函数?我尝试了:
from application.app.folder.file import func_name
但它不起作用。
当前回答
在linux上的python3中为我工作
import sys
sys.path.append(pathToFolderContainingScripts)
from scriptName import functionName #scriptName without .py extension
其他回答
尝试Python的相对导入:
from ...app.folder.file import func_name
每个前导点都是从当前目录开始的层次结构中的另一个更高级别。
问题?如果这对你不起作用,那么你可能会被许多gotcha的相对进口产品所蚕食。阅读答案和评论以了解更多详细信息:如何修复“尝试在非包中进行相对导入”,即使使用__init__.py
提示:在每个目录级别都有__init__.py。您可能需要python-m application.app2.some_folder.some_file(去掉.py),它可以从顶层目录运行,也可以在PYTHONPATH中包含该顶层目录。呸!
下面的代码以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())
重要警告:该模块将被视为顶级模块;从父包中的任何相对导入都将失败。
这里的答案不够清晰,这是在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解释器可以在当前目录(将其他模块导入的脚本)中找到模块;稍后工作结束后,可以删除符号链接。此外,您应该忽略.gitignore中的符号链接,这样就不会意外地将符号链接模块提交到repo中。这种方法甚至可以让您成功地处理与正在执行的脚本并行的模块。
ln -s ~/path/to/original/module/my_module ~/symlink/inside/the/destination/directory/my_module
name-file.py中的第一个导入系统
import sys
第二次在name-file.py中追加文件夹路径
sys.path.insert(0, '/the/folder/path/name-package/')
第三,在子目录中创建一个名为__init__.py的空白文件(这告诉Python它是一个包)
name-file.py名称包__初始化__.py名称模块.py
第四步导入name-file.py文件夹中的模块
from name-package import name-module