我有这样的文件夹结构:
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
但它不起作用。
当前回答
您的问题是Python正在Python目录中查找此文件,但没有找到它。您必须指定您所指的是您所在的目录,而不是Python目录。
要执行此操作,请更改此项:
从application.app.folder.file导入func_name
为此:
from .application.app.folder.file import func_name
通过添加点,您可以在这个文件夹中查找应用程序文件夹,而不是在Python目录中查找。
其他回答
这对我在窗户上有用
# 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)
希望有人能在评论中澄清为什么这样做有效。尽管如此,我也希望它能帮助一些人。
├───root
│ ├───dir_a
│ │ ├───file_a.py
│ │ └───file_xx.py
│ ├───dir_b
│ │ ├───file_b.py
│ │ └───file_yy.py
│ ├───dir_c
│ └───dir_n
您可以将父目录添加到PYTHONPATH,为了实现这一点,您可以在sys.path中列出的“模块搜索路径”中使用依赖于操作系统的路径。因此,您可以像下面这样轻松地添加父目录:
# file_b.py
import sys
sys.path.insert(0, '..')
from dir_a.file_a import func_name
我通常会创建一个指向要导入的模块的符号链接。符号链接确保Python解释器可以在当前目录(将其他模块导入的脚本)中找到模块;稍后工作结束后,可以删除符号链接。此外,您应该忽略.gitignore中的符号链接,这样就不会意外地将符号链接模块提交到repo中。这种方法甚至可以让您成功地处理与正在执行的脚本并行的模块。
ln -s ~/path/to/original/module/my_module ~/symlink/inside/the/destination/directory/my_module
你可以使用pip的pipinstall-e。命令您必须在项目目录的根目录中创建一个名为setup.py的文件,该文件包含以下内容:
from setuptools import find_packages, setup
setup(
name='src',
packages=find_packages(),
version='0.1.0',
description='my_project',
author='author',
license='MIT',
)
然后,输入pipinstall-e。而在项目的根目录中。这将使所有目录都能以其名称作为模块进行调用。例如,如果根目录包含子目录module1和module2,每个子目录中都有脚本,则可以使用以下命令从任何子目录访问module1:
将模块1.script1导入为script1