0

我知道这是一个愚蠢的问题,但我很难过。我的目录结构曾经是这样的:

-src
  |
  -module.py
  -program.py

当这是我的目录结构时,我从程序中引用了模块,一切都很好。

从那以后,我将目录结构更改为:

-src
  |
  -__init.py
  -module.py
  |
  -programDir
    |
    -__init.py
    -program.py

现在,当然,我无法从程序访问模块。如何将 src 作为包引用。我试图创建一个

__init__.py 

src 目录中的文件,但没有运气。

Moar deets:我在 program.py 中尝试过的导入语句:

import module

from src import module

当另一个模块和程序位于同一目录中时,第一个工作。

我得到的错误:

ImportError: No module named module

仅作记录:不,我的模块和程序不称为模块或程序

更新:我在我的 program.py 文件中试过这个:

from ...src import module

from ..src import module

两者都给我:

ValueError: Attempted relative import in non-package
4

6 回答 6

2

对于初学者,我建议阅读文档中的修改 Python 的搜索路径

有些人可能不赞成它,但是如果您希望从程序中修改PYTHONPATH,根据文档的标准模块条目,您可以使用 sys.path.append 方法:

import sys
sys.path.append('..')
import module
于 2011-02-24T21:23:03.063 回答
1

你不能使用PEP 328来解决这个问题吗?

于 2011-02-24T22:10:16.927 回答
0

如果您program.py直接运行,使用python program.py或使用#!,那么module.py的目录应该在 PYTHONPATH 中import module才能工作。这可以使用保存在 中的辅助 shell 脚本来实现programDir,例如,看起来像:

#!/bin/bash

script_dir=`dirname $0`
# Add the script's parent directory to the PYTHONPATH
export PYTHONPATH=$PYTHONPATH:$script_dir/..

python $script_dir/program.py

另一种可能更好的方法是program.py导出一个“ main()”函数,然后创建一个帮助 python 脚本src/program,如下所示:

#!/usr/bin/env python
from programDir.program import main
main()

在这种情况下,您可以在 中使用相对导入src/programDir/program.py,因此应该可以:

from .. import module
于 2011-02-24T21:07:05.433 回答
0

第一个有效,因为 Python 的sys.path第一个条目是 '',这意味着它将在您执行 Python 解释器的当前工作目录中查找模块名称。

您似乎遇到的问题是src您的 PYTHONPATH 上未设置位于的目录。因此,您可以明确设置 PYTHONPATH 环境变量。

这是一个使用 bash 的示例:

export PYTHONPATH=PATH_TO_SRC:${PYTHONPATH}

然后正常运行你的程序

另一种方法是您可以sys.path通过在执行程序时附加到它来显式设置。

因此,在您的 中program.py,您将拥有:

if __name__ == '__main__':
    import os
    import sys
    sys.path.append(os.path.dirname(os.path.dirname(__file__)))
    your_main_function()

最后,对于严肃的 python 开发,你应该考虑virtualenvvirtualenvwrapper,因为它会为你处理大部分这些事情。

于 2011-02-24T21:09:35.603 回答
0

您需要添加__init__.py/programDir将目录解释为包。一旦一个包,您可以导入包的内容。

因此,在您的情况下,如果/src在 , 上PYTHONPATHmodule.py您可以program.py使用from programDir import program.

于 2011-02-24T21:10:01.360 回答
0

如果您将程序用作包的一部分,则在另一个 python 模块中,例如

import src.programDir.program as p

p.some_method()

您可以在 program.py 中使用相对导入,假设您正在使用 src 创建一个包(__init__.py在 src 和 programDir 中)

from .. import module

如果不是,例如您从命令行调用 program.py,则必须sys.path在导入之前通过修改或 PYTHONPATH env var 将包含 src 的目录添加到搜索路径。

于 2011-02-25T03:41:54.887 回答