2016-05-16 46 views
0

首先,假设一个Python包标题mypackage,它遵循导向How To Package Your Python Code的指示的目录结构如下:自参考而单元测试

mypackage/ 
mypackage/mypackage/ 
mypackage/mypackage/__init__.py 
mypackage/mypackage/a_function.py 
mypackage/scripts/ 
mypackage/scripts/a_script.py 
mypackage/tests/ 
mypackage/tests/a_function_test.py 
mypackage/misc/ 
mypackage/misc/input.txt 
# mypackage/misc/actual_output.txt ## Not yet generated! 
mypackage/misc/expected_output.txt 
mypackage/setup.py 

其次,假定脚本a_script.py进口a_function.py,读取文件input.txt,操纵input.txt的内容并将后者保存为actual_output.txtmypackage/misc/

第三,假设单元测试模块mypackage/misc/包含测试功能,通过self.assertMultiLineEqual(expected, actual)比较expected_output.txtactual_output.txt

最后,假设我想通过python2 setup.py test运行unittest模块。

如何指定没有硬编码的绝对文件路径(和,因此,防止我的包的任何转让)的a_function_test.pyactual_output.txtexpected_output.txt位置?

代价:

我理论上可以硬编码内包路径每两个输入文件的。但是,如果Python解释器尚未安装到site-packages,它如何知道在哪里寻找mypackage?我有以下想法,但它不能作为mypackage还不知道:

base_path = os.path.split(inspect.getfile(mypackage))[0] 
within_path = mypackage/misc/ 
expected = open(base_path + within_path + expected_output.txt).read() 
actual = open(base_path + within_path + actual_output.txt).read() 
self.assertMultiLineEqual(expected, actual) 

回答

0

a_script.py你可以到主mypackage像这样:

mypackage_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 

或:

mypackage_dir = os.path.dirname(os.path.abspath(__package__)) 

然后,可以建立其他路径,因为您知道子包的名称:

misc_dir = os.path.join(mypackage_dir, 'misc') 
tests_dir = os.path.join(mypackage_dir, 'tests') 
+0

谢谢,但'os.path.abspath(__ package __)'失败,出现'AttributeError:'NoneType'对象没有属性'startswith''。 –

+0

你的目录是python包吗?是否有包含在其中的'__init __。py'。否则,它可能不起作用 –

+0

我只在'mypackage/mypackage /'中放置了一个'__init __。py'(参见编辑的问题)。哪些其他子包应该放置一个'__init __。py'到? –