【问题标题】:How to shadow python builtin pwd module如何隐藏 python 内置 pwd 模块
【发布时间】:2013-05-07 21:45:54
【问题描述】:

有一些 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”,我很抱歉。欢迎提出想法。

【问题讨论】:

    标签: python windows built-in shadowing pwd


    【解决方案1】:

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

    try:
        import pwd
    except ImportError:
        import winpwd as pwd
    

    通过这种方式导入pwd,您将在Linux 上获得内置的pwd,在Windows 上获得winpwd。然后你应该可以随心所欲地运行测试和模拟它。

    【讨论】:

    • 你应该如何安装winpwd? pip 没有将其编入索引,谷歌搜索会发现奇怪的东西。
    • @syonip, @Locane:那个模块不存在; winpwd 是 unutbu 编造的名称(参见 OP)
    • 这不起作用。在带有 python 3.7 的 Windows Server 2012 中。模块 pwd 本身不能作为 Windows 标准安装的一部分。
    【解决方案2】:
    import os
    if os.name == 'nt':
        class Pwd():
            def getpwnam(self, user):
                pass
        pwd = Pwd()
    else:
        import pwd
    

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

    【讨论】:

    • 这不会像写的那样工作。每个方法都必须是一个 @classmethod 修饰函数。
    • 为什么这不起作用?我刚刚创建了一个可以实例化的类?那里,修好了吗?
    • 刚刚阅读了 OP 的最后两行,他不是一位经验丰富的 Python 开发人员,我希望有常识.. 但肯定我的预编辑有点坏了。所以我猜thx :)
    • 感谢您的回答。它并不完全适合我们的场景,但如果可以的话,我肯定会 +1。
    • Np,只是觉得不必运送额外的文件会很有用:) Gl 与您的项目。
    猜你喜欢
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2021-11-25
    • 2016-07-10
    相关资源
    最近更新 更多