如何影子python内置的pwd模块

Dmi*_*san 5 python windows built-in shadowing pwd

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

import pwd
   ...
  def func():
      user=pwd.getpwnam(user)[2]
Run Code Online (Sandbox Code Playgroud)

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

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

# pwd.py
def getpwnam(user):
    print("YESSSSSSSS")
Run Code Online (Sandbox Code Playgroud)

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

unu*_*tbu 11

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

try:
    import pwd
except ImportError:
    import winpwd as pwd
Run Code Online (Sandbox Code Playgroud)

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

  • @syonip,@ Locan:那个模块不存在; `winpwd`是unutbu组成的名字(参见OP) (4认同)

Tor*_*xed 6

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

类似的工作可以吗?项目中不需要额外的 .py 文件。
我自己用过fchown几次...