我有这样的文件夹结构:

application
├── app
│   └── folder
│       └── file.py
└── app2
    └── some_folder
        └── some_file.py

如何从file.py或some_file.py中导入函数?我尝试了:

from application.app.folder.file import func_name

但它不起作用。


当前回答

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

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

其他回答

所以我刚刚右键单击了我的IDE,并添加了一个新文件夹,我想知道为什么不能从中导入。后来我意识到我必须右键单击并创建一个Python包,而不是一个经典的文件系统文件夹。或者一种事后分析方法,添加__init__.py(这使得python将文件系统文件夹视为一个包),如其他答案中所述。在这里添加这个答案,以防有人走这条路。

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

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")

编码愉快!

只需使用os模块中的change-dir函数:

os.chdir("Here new director")

比正常情况下可以导入的更多信息

我正在处理项目a,我希望用户通过pip-install a使用以下文件列表进行安装:

.
├── setup.py
├── MANIFEST.in
└── a
    ├── __init__.py
    ├── a.py
    └── b
        ├── __init__.py
        └── b.py

设置.py

from setuptools import setup

setup (
  name='a',
  version='0.0.1',
  packages=['a'],
  package_data={
    'a': ['b/*'],
  },
)

歧管in

recursive-include b *.*

a/init.py

from __future__ import absolute_import

from a.a import cats
import a.b

a/a.py

cats = 0

a/b/init.py

from __future__ import absolute_import

from a.b.b import dogs

a/b/b.py

dogs = 1

我通过在MANIFEST.in目录下运行以下命令来安装模块:

python setup.py install

然后,在我的文件系统上的一个完全不同的位置上,我可以运行:

import a
dir(a)

这证实了a.ats确实等于0,a.b.dogs确实等于1,正如预期的那样。

我的解决方案。他们在包中拥有所有必需的init__.py,但import仍然不起作用。

import sys
import os
sys.path.insert(0, os.getcwd())

import application.app.folder.file as file