我知道这是一个愚蠢的问题,但我很难过。我的目录结构看起来像这样:
-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
答案 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.py
或python 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开发,你应该考虑virtualenv和virtualenvwrapper,因为它会为你处理大部分这些事情。
答案 4 :(得分:0)
您需要将__init__.py
添加到/programDir
以将目录解释为包。一旦打包,您就可以导入包的内容。
因此,在您的情况下,如果/src
位于PYTHONPATH
,module.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的目录添加到搜索路径。