由于语言环境,Python测试在Ubuntu上传递Gentoo失败?

时间:2016-03-06 23:05:11

标签: python linux ubuntu

我的测试依赖于使用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中的lsos.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

1 个答案:

答案 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'))]):

现在所有测试都通过,无论操作系统如何。