2

第一次发帖,所以如果我遗漏了一些细节,请原谅我。

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

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

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

在根目录中,我有一个名为 myprog.py 的 .py 文件:

#file .\myprog.py

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

在函数文件夹中,我有两个文件,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(从子文件夹执行时)不断出现错误:ValueError: Attempted relative非包导入

我在 mysub.py 中尝试了不同的组合,例如 from ..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 *'s,但是,我宁愿不必每次调用 hello 函数时都将完整路径放入,所以任何建议都在那里或清理 init.py (使用all或以其他方式)将是一个奖励。

感谢 Blckknght 编辑,我还发现了以下内容: 第 10 亿次相对进口

哪一个,如果我要求的是不可能的,也许我问错了。如果这只是完全不好的做法,是使用 sys.path 实现我的目标的正确方法还是有人可以推荐其他东西(比如不从 ../folders 调用函数)?

4

1 回答 1

1

我认为这个问题与你如何运行mysub.py脚本有关。Python 不太擅长处理包中的脚本,因为主脚本模块总是被命名__main__而不是通常的名称。

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

于 2013-07-14T19:14:41.930 回答