Python相对路径从子文件夹导入

时间:2013-07-14 18:54:11

标签: python-2.7

首先发布到SO,所以如果我错过了一些细节,请原谅我。

有没有办法使用来自另一个子文件夹的相对路径而不需要通过os修改sys.path?最终这将从cgi网络服务器运行,所以我宁愿远离python.exe的任何-m参数。

我正在使用Python 2.7.3并且具有以下文件/目录结构:

|   myprog.py
|
+---functions
|       myfunctions.py
|       __init__.py
|
\---subfolder
        mysub.py

在root中,我有一个名为myprog.py的单个.py文件:

#file .\myprog.py

from functions import *
hello("Hi from Main")

在functions文件夹中我有两个文件, init .py,myfunctions.py:

#The File: functions\__init__.py :
from myfunctions import *

#The File: functions\myfunctions.py :
def hello(sometext):
   print sometext

最后,在子文件夹中,我有:

#The File: subfolder\mysub.py :

from ..functions import *
hello("Hi From mysubprogram")

myprog.py执行正常(从父文件夹运行python.exe myprog.py时),打印“Hi From Main”,然而,mysub.py(从子文件夹执行时)不断输出错误:< i> ValueError:在非包中尝试相对导入

我在mysub.py中尝试了不同的组合,例如来自..functions.myfunctions import *但是没有产生所需的结果。

我已阅读了一些相关文章:
using __init__.py
How to import classes defined in __init__.py
http://docs.python.org/2/tutorial/modules.html#packages-in-multiple-directories

但是无法弄清楚这一点。哦,一旦我开始工作,我想尽可能删除import *,但是,每次调用时我都不必将完整路径放到hello函数中,所以任何建议都在那里或者清理init.py(使用所有或以其他方式)将是一个奖励。

感谢Blckknght编辑,我也发现了以下内容: Relative imports for the billionth time

其中,如果我要求的是不可能的,也许我问错了。如果这只是一个彻头彻尾的坏习惯,是使用sys.path实现目标的正确方法,还是有人可以推荐的其他内容(比如不调用../folders中的函数)?

1 个答案:

答案 0 :(得分:1)

我认为问题与您运行mysub.py脚本的方式有关。 Python不适合使用包中的脚本,因为主脚本模块总是以__main__而不是通常的名称命名。

我认为您可以通过mysubpython -m subfolder.mysub一起运行,或通过操纵__package__中的mysub.py变量来解决此问题(如PEP 366所述)。不幸的是,它并不整洁。