如何影子python内置的pwd模块

时间:2013-05-13 18:56:03

标签: python windows built-in shadowing pwd

有一些python代码可以在Linux下运行。它以这样的方式使用pwd模块:

import pwd
   ...
  def func():
      user=pwd.getpwnam(user)[2]

现在我们有一个特定的需要用测试来覆盖这个代码,测试必须在Windows下运行。程序本身只能在Linux下运行。问题是pwd模块在Windows下不可用,因此即使使用MagicMock模拟pwd函数的实现,受测试的代码也会因ImportError而失败。

解决此问题的基本思路是在运行测试时隐藏pwd模块。因此,当运行测试时,存根将影响pwd,并且在运行主程序时,将使用原始(Unix)pwd。我们在测试PYTHONPATH创建了这样的存根:

# pwd.py
def getpwnam(user):
    print("YESSSSSSSS")

但它似乎没有影响一个pwd模块,在调试器中我们看到内置的pwd是导入的。我主要是一名Java开发人员,所以如果做事的方式不是“pythonic”,我很抱歉。欢迎提出意见。

2 个答案:

答案 0 :(得分:10)

pwd.py重命名为其他内容,例如winpwd.py。然后使用:

try:
    import pwd
except ImportError:
    import winpwd as pwd

通过这种方式导入pwd,您将获得Linux上的内置pwd和Windows上的winpwd。然后你应该能够运行测试并随意模拟它。

答案 1 :(得分:4)

import os
if os.name == 'nt':
    class Pwd():
        def getpwnam(self, user):
            pass
    pwd = Pwd()
else:
    import pwd

有类似的工作吗?您的项目中不需要额外的.py文件 我自己曾经用fchown几次......