我的测试依赖于使用os.walk
在文件系统上查找它们。我怀疑测试因区域设置而失败,因为ls
显示了不同的排序。
以下是Gentoo上的ls
,其中测试通过:
$ ls test_root/
blogit.db f.md post10.md post12.md post14.md post16.md post18.md post1.md post2.md post4.md post6.md post8.md
e.md page.md post11.md post13.md post15.md post17.md post19.md post20.md post3.md post5.md post7.md post9.md
区域设置为LANG=en_US.utf8
。
以下是Ubuntu上的ls
:
$ ls test_root/
blogit.db f.md post1.md post11.md post13.md post15.md post17.md post19.md post20.md post4.md post6.md post8.md
e.md page.md post10.md post12.md post14.md post16.md post18.md post2.md post3.md post5.md post7.md post9.md
如果我发出LANG=C ls
,我会在Ubuntu上获得相同的排序。现在我可以去修复我的测试,或修复我的语言环境。我认为这是在Ubuntu上运行测试的快速解决方案:
$ LANG=en_US.utf8 py.test tests
但这没有效果。 LANG=en_US.utf8 ls
也不会改变顺序。
那么我如何影响Ubuntu中的ls
或os.walk
排序?
以下是os.walk
列出Gentoo文件的方式:
In [3]: for r, d , f in os.walk('test_root'):
for n in f:
print n
...:
blogit.db
page.md
post1.md
post2.md
post3.md
... snipped ...
post17.md
post18.md
post19.md
post20.md
这是Ubuntu中的相同代码:
In [6]: for r, d , f in os.walk('test_root'):
for n in f:
print(n)
...:
blogit.db
post11.md
page.md
post9.md
post7.md
post3.md
post6.md
post17.md
post20.md
post5.md
post1.md
post2.md
post16.md
post8.md
post12.md
post18.md
post19.md
post10.md
post15.md
post13.md
post4.md
post14.md
答案 0 :(得分:1)
好的,多亏了这里的提示,我决定不再依赖os.walk
,而是改变了代码:
for root, dirs, files in os.walk(CONFIG['content_root']):
for filename in files:
if filename.endswith(('md', 'markdown')):
为:
for root, dirs, files in os.walk(CONFIG['content_root']):
for filename in sorted([f for f in files if.endswith(('md', 'markdown'))]):
现在所有测试都通过,无论操作系统如何。