Gentoo为什么Python测试通过,但在Ubuntu却因为locale而失败?

2024-04-25 08:05:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我的测试依赖于在文件系统中用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

Tags: testdbpost2osubuntupagerootpost1
1条回答
网友
1楼 · 发布于 2024-04-25 08:05:51

好的,多亏了这里的提示,我决定不再仅仅依赖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'))]):

现在所有的测试都通过了,不管是操作系统

相关问题 更多 >