[python] 从不同文件夹导入文件



Answers

没有错:

from application.app.folder.file import func_name

只要确保文件夹中还包含一个__init__.py ,这可以将它作为一个包装包含在内。 不知道为什么其他答案谈论PYTHONPATH。

Question

我有以下文件夹结构。

application/app/folder/file.py

我想从驻留在另一个Python文件中的file.py导入一些函数

application/app2/some_folder/some_file.py

我试过了

from application.app.folder.file import func_name

和其他一些尝试,但到目前为止我无法正常导入。 我怎样才能做到这一点?




考虑将application作为您的python项目的根目录,在applicationappfolderfolder夹中创建一个空的__init__.py文件。 然后在您的some_file.py进行如下更改以获取func_name的定义:

import sys
sys.path.insert(0, r'/from/root/directory/application')

from application.app.folder.file import func_name ## You can also use '*' wildcard to import all the functions in file.py file.
func_name()



我认为一个简单的方法是使用文档中描述的环境变量PYTHONPATHPython2Python3

export PYTHONPATH=$HOME/dirWithScripts/:$PYTHONPATH
# Windows users: use "set" instead of "export"



你的问题是,Python正在寻找这个文件的Python目录,而没有找到它。 你必须指定你正在谈论你所在的目录,而不是Python目录。

要做到这一点,你可以改变它:

from application.app.folder.file import func_name

对此:

from .application.app.folder.file import func_name

通过添加点,你要说的是在这个文件夹中查找应用程序文件夹,而不是查看Python目录。




这适用于我在Windows上

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

import some_file



将应用程序移至其他环境时,将sys.path.append与绝对路径配合使用并不理想。 使用相对路径并不总是有效,因为当前工作目录取决于脚本如何运行。

由于应用程序文件夹结构是固定的,我们可以使用os.path来获取完整路径。 例如,如果这是结构:

/home/me/application/app2/some_folder/vanilla.py
/home/me/application/app2/another_folder/mango.py

假设您想要导入“芒果”模块。 您可以在vanilla.py中执行以下操作:

import sys, os.path
mango_dir = (os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
+ '/another_folder/')
sys.path.append(mango_dir)
import mango

当然,你不需要mango_dir变量。

要理解这个工作原理如何看待这个交互式会话示例:

>>> import os
>>> mydir = '/home/me/application/app2/some_folder'
>>> newdir = os.path.abspath(os.path.join(mydir, '..'))
>>> newdir
    '/home/me/application/app2'
>>> newdir = os.path.abspath(os.path.join(mydir, '..')) + '/another_folder'
>>> 
>>> newdir
'/home/me/application/app2/another_folder'
>>> 

并检查os.path文档。




在我的情况下,我有一个课程导入。 我的文件是这样的:

# /opt/path/to/code/log_helper.py
class LogHelper:
    # stuff here

在我的主文件中,我通过以下代码包含代码:

path.append("/opt/path/to/code/")
from log_helper import LogHelper



我很特别:我在Windows上使用Python!

我只是完成信息:对于Windows和Linux,相对路径和绝对路径都可以工作到sys.path (我需要相对路径,因为我在几台PC上和不同的主目录下使用我的脚本)。

而当使用Windows时, \/可以用作文件名的分隔符,当然,您必须将\转换为Python字符串,
一些有效的例子:

sys.path.append('c:\\tools\\mydir')
sys.path.append('..\\mytools')
sys.path.append('c:/tools/mydir')
sys.path.append('../mytools')

(注意:我认为/\更方便,如果它比'Windows原生'更方便,因为它与Linux兼容,并且更易于写入和复制到Windows资源管理器)




Links