我的pythonpath有问题

时间:2011-02-24 20:52:51

标签: python pythonpath

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

-src
  |
  -module.py
  -program.py

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

我已将目录结构更改为:

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

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

__init__.py 

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

Moar deets: 我在program.py中试过的import语句:

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

6 个答案:

答案 0 :(得分:2)

对于初学者,我建议您阅读文档中的条目Modifying Python's Search Path

有些人可能不赞成,但是如果你想修改程序中的PYTHONPATH,根据文档的standard modules条目你可以使用sys.path.append方法:< / p>

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

如果您使用program.pypython program.py直接投放#!,则module.py的目录应位于PYTHONPATH中,import module才能正常运行。例如,这可以使用保存在programDir中的帮助程序shell脚本来实现,如下所示:

#!/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()”函数,并在src/program创建一个辅助python脚本,如下所示:

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

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

from .. import module

答案 3 :(得分:0)

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

您似乎遇到的问题是您的PYTHONPATH上未设置位于src的目录。因此,您可以明确设置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,因为它会为你处理大部分这些事情。

答案 4 :(得分:0)

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

因此,在您的情况下,如果/src位于PYTHONPATHmodule.py来自program.py,则可以from programDir import program导入{{1}}。

答案 5 :(得分:0)

如果您使用program作为包的一部分,则在另一个python模块中使用,例如

import src.programDir.program as p

p.some_method()

你可以在program.py中使用相对导入,假设你正在创建一个包含src的包(src和programDir中都是__init__.py

from .. import module

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