16

我有以下文件排列:

python
|---- main.py
|---- files
      |---- folder1
            |---- a.py, a1.py, ...
      |---- folder2
            |---- b.py, b1.py, ...

我想导入我的模块a.py和. 为此,我使用了以下命令:b.pymain.pymain.py

a = 'C:/python/files/folder1'
sys.path.insert(0, a)
from files.folder1 import *

但是,我无法从文件夹 1 导入模块(类似于文件夹 2)。

我收到一个错误:

没有名为 files.folder1 的模块

我不能使用导入命令,因为文件夹 1、文件夹 2、...中有很多 Python 文件

我在这里想念什么?

4

5 回答 5

33

将文件__init__.py(可以为空白)添加到文件夹filesfolder1folder2。然后你得到一个包含子包folder1folder2的包文件。在此之后,您可以像这样从 main.py 导入:

from files.folder1 import *
于 2012-11-28T06:29:17.453 回答
19

当我在 Python 2.7 中执行此操作时,我使用:

import sys
sys.path.append('C:/python/files/folder1')

import a
import a1

这是我构建的一个 hack,用于将目录中的所有模块导入字典:

import os
import sys

dir_of_interest = 'C:/python/files/folder1'
modules = {}

sys.path.append(dir_of_interest)
for module in os.listdir(dir_of_interest):
    if '.py' in module and '.pyc' not in module:
        current = module.replace('.py', '')
        modules[current] = __import__(current)

我刚刚构建它,它非常hacky,但它可能更像你想要的东西。所以,要访问你想要的模块,而不是说module_name.thing你会说modules["module_name"].thing

于 2012-11-28T06:20:13.917 回答
3

我不能使用导入命令,因为文件夹 1、文件夹 2、...中有很多 Python 文件

我在这里想念什么?

我相信您缺少的部分是每个文件夹中的__init__.py文件。该文件应包含一个__all__变量,该变量列出将由以下方式导入的所有子模块:from somepackage.subpackage import *

这一切都在包的 Python 教程部分中得到了优雅的解释。

于 2012-11-28T06:25:55.363 回答
2

如果您添加folder1到路径中,这并不意味着您可以folder1作为模块导入。这意味着您可以导入文件夹 1 中的文件。所以你可以这样做:

import a
import a1

如果你想folder1成为一个包其中aa1是模块,你需要放入一个__init__.py然后folder1import folder1。如果您进一步希望能够执行from folder1 import *并拥有该导入aa1,您需要将代码放入您__init__.py的导入aa1

如果您希望能够以结构化方式导入的文件夹中有很多文件,则应该将该文件夹放入一个包中。

于 2012-11-28T06:22:13.747 回答
0

查看文件夹结构,您可以做的是,简单

from files.folder1 import a , a1
from files.folder2 import b , b1

这应该会有所帮助

.

附加:我最近想到一个问题,导入pip包而不实际安装它们,然后我所做的是……我在虚拟环境中安装了包,只复制了包名的文件夹。

例如。如果包名称是 qwikidata ,那么我转到 /Lib 文件夹并仅复制 qwikidata 文件夹并将其粘贴到我的项目的根目录中,在您的情况下,main.py 文件所在的位置和 pip 卸载了包,以避免错误

现在我能够在没有实际安装 pip 的情况下导入包,因为包位于项目的根文件夹中

如果项目不是那么复杂,那应该没问题,但我不推荐这种安装包的方式。

当您想在其他机器上运行您的项目并且您没有 Internet 连接时,它会有所帮助。

于 2021-06-19T06:53:19.217 回答