从另一个目录导入文件

3
我有一个名为entryPoint.py的文件:
from .commonLib.deviceLib import *

我有一个名为deviceLib.py的文件:

import math
import sys
import logging
import requests
import this

class DeviceLib(object):
    def __init__(self, connectionDb):
        self.__db = connectionDb

树的结构如下:
/test
    entryPoint.py
/commonLib
    __init__.py
    deviceLib.py

当我执行python entryPoint.py时,我收到错误消息:Attempted relative import in non-package。请帮助我解决这个问题。

1
你从哪里运行entryPoint.py?你的工作目录可能会突出显示错误。 - tda
可能是如何在Python中进行相对导入?的重复问题。 - colidyre
1
一般建议:如果可能的话,最好避免使用import *,以免名称空间过度淹没/覆盖(可能很危险)。另外,你真的需要import this吗? - colidyre
注意 @colidyre... - Menfis Menfis
尝试以下事项。1)将__init__.py添加到/test中。2)尝试在entryPoint.py导入语句的第一个.被删除后运行python test/entryPoint.py - tda
3个回答

14

使用 sys.path.append 将包含你的Python文件(模块)的目录添加到路径中。例如,如果你的 entryPoint.py 文件在 address 目录内,则应这样操作。

import sys
sys.path.append('/path/to/your/module/address/')
import entryPoint

1

在/test和/commonLib文件夹中都应该有__init__.py文件。

然后只需执行以下操作:

from commonLib import deviceLib

例如
sound
|-- effects
|   |-- echo.py
|   |-- __init__.py
|   |-- reverse.py
|   `-- surround.py
|-- filters
|   |-- equalizer.py
|   |-- __init__.py
|   |-- karaoke.py
|   `-- vocoder.py
|-- formats
|   |-- aiffread.py
|   |-- aiffwrite.py
|   |-- auread.py
|   |-- auwrite.py
|   |-- __init__.py
|   |-- wavread.py
|   `-- wavwrite.py
`-- __init__.py

假设您现在打开了wavread.py文件,位于格式子目录中,您可以通过以下方式从filters导入karaoke.py:

from filters import karaoke

这里有更多信息, https://www.python-course.eu/python3_packages.php


假设我们在与 /sound 同级的另一个文件夹中有一个名为 /sound1 的文件夹,并且我想从 /sound1 导入一个文件。 - Menfis Menfis
请纠正我,但这只能在工作目录为 sound/ 的情况下工作。如果您的工作目录是 formats/,则无法正常工作。 - tda
@TD-Asker 没错。你应该在主目录中,那里存放着其他所有文件。这样你就可以将包打包,然后将其托管到 pypi 中以便通过 pip 安装。一旦通过 pip 安装,你就可以在计算机的任何目录中,但仍能够导入 sound 和 sound 子脚本。 - Khalil Al Hooti
@MenfisMenfis,那么sound和sound1应该在一个共同的目录中,该目录具有__init__.py。这个共同的目录是主目录,也是你的包名。 - Khalil Al Hooti
如果我从命令行运行脚本,而不调整sys.path,它仍然会抱怨“没有名为...的模块”。 - kakyo

0

要从另一个目录导入文件,您可以使用以下代码:

import sys
sys.path.insert(0, 'folder destination')
import file

正如您可以在这里看到的那样,我们包含了路径,以便Python也会在该路径中查找文件。


sys.path.insert 将会添加该路径,这样 Python 也会在该目录中查找您的文件。 - amirhosein majidi
1
是的,或者您可以使用“import”系统?肯定不是最简单的方法,但您不应该需要处理“sys.path”。 - roganjosh
尽管这是一种解决方案,但考虑到您可能想从多个子目录进行多个相对导入等想法。 逐个将每个目录插入每个脚本是不切实际的... - tda
关于这个问题,您可以阅读以下链接:https://docs.python.org/3.4/tutorial/modules.html#the-module-search-path - amirhosein majidi
是的,但那不是你提供的答案。 - tda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接