我有这样的文件夹结构:

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中使用Python!

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

当使用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资源管理器)

其他回答

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

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

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

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

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

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

我多次遇到同一个问题,所以我想分享我的解决方案。

Python版本:3.X

以下解决方案适用于在Python 3.X版本中开发应用程序的人,因为自2020年1月1日以来,Python 2不受支持。

项目结构

在python3中,由于隐式命名空间包,项目子目录中不需要__init__.py。请参见Python 3.3中的包是否不需要init.py+

Project 
├── main.py
├── .gitignore
|
├── a
|   └── file_a.py
|
└── b
    └── file_b.py

问题陈述

在file_b.py中,我想在文件夹a下的file_a.py中导入一个类a。

解决

#1快速但肮脏的方式

不安装软件包,就像您当前正在开发一个新项目

使用try-catch检查是否存在错误。代码示例:

import sys
try:
    # The insertion index should be 1 because index 0 is this file
    sys.path.insert(1, '/absolute/path/to/folder/a')  # the type of path is string
    # because the system path already have the absolute path to folder a
    # so it can recognize file_a.py while searching 
    from file_a import A
except (ModuleNotFoundError, ImportError) as e:
    print("{} fileure".format(type(e)))
else:
    print("Import succeeded")

#2安装软件包

安装应用程序后(在本文中,不包括安装教程)

你可以简单地

try:
    from __future__ import absolute_import
    # now it can reach class A of file_a.py in folder a 
    # by relative import
    from ..a.file_a import A  
except (ModuleNotFoundError, ImportError) as e:
    print("{} fileure".format(type(e)))
else:
    print("Import succeeded")

编码愉快!

而不是仅仅做一个导入。。。,执行以下操作:

从<MySubFolder>导入<MyFile>

MyFile位于MySubFolder中。

我也面临着同样的挑战,尤其是在导入多个文件时,这就是我如何克服的。

import os, sys

from os.path import dirname, join, abspath
sys.path.insert(0, abspath(join(dirname(__file__), '..')))

from root_folder import file_name