2012-06-18 42 views
1

我有以下的目录结构调用脚本因此,我可以在导入a之前将以下行添加到b.py。Python的相对进口从随机目录

sys.path.append(os.path.dirname(sys.argv中[0])+ “/ ..”)

这工作和我可以从任何目录调用b.py并且它能够导入一个。 但是,当我在另一个目录中编写脚本以使用execfile()调用此文件时,此操作失败。

我试过相对导入,但我得到

from ..a import someclass as cls 

了“非套餐错误尝试相对导入”我有两个test1的__init__.py,test2的

是否有人有一个想法,如何使它工作? 是PYTHONPATH要走的路吗?

回答

1

问题是execfile将评估您调用的文件为纯Python代码。 b.py(及其导入的任何包模块)中的每个相关导入语句都必须保持对您的调用脚本正确。

一个解决方案是不在包中使用任何相对导入路径。确保test1包也在您的PYTHONPATH上。

b.py

from test1 import a 

随着test1在你的PYTHONPATH,a应该成功的进口在execfile

>>> import sys 
>>> sys.path.append('/path/to/parent/of_test1') 
>>> execfile('/path/to/parent/of_test1/test1/test2/b.py') 
+0

我有'__init __。py'。它仍然不起作用。 '__file__'是不好的,当我第三个脚本使用execfile调用b.py。打印'__file__'打印其他文件的名称。 –

+0

@iamrohitbanga:无论如何尝试允许脚本在依赖其他模块的程序包中执行“execfile”模块,我认为您将面临问题。 'execfile'评估模块的纯代码,因此在执行脚本中相关模块中的所有相关内容也必须相似。 – jdi

+0

我想你是对的。我想我需要四处寻找一个更方便的编译环境解决方案。 –