如何在Python3.8+;和Python 2.7+;?

如何在Python3.8+;和Python 2.7+;?,python,python-3.x,python-2.7,python-unittest,Python,Python 3.x,Python 2.7,Python Unittest,我正在编写一个API客户端库。该库旨在支持Python 2.7+和Python 3+ 现在编写测试并尝试使用MagicMock和patch。根据此处的文档,如果我安装mock(使用pip install mock==3.0.5),则有一个unittest.mock的后端口。但当我在docker映像中安装它时,行: from unittest.mock import patch 仍然失败: Traceback (most recent call last): File "/opt/conda

我正在编写一个API客户端库。该库旨在支持Python 2.7+和Python 3+

现在编写测试并尝试使用
MagicMock
patch
。根据此处的文档,如果我安装
mock
(使用
pip install mock==3.0.5
),则有一个
unittest.mock
的后端口。但当我在docker映像中安装它时,行:

from unittest.mock import patch
仍然失败:

Traceback (most recent call last):
  File "/opt/conda/envs/py27/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/opt/conda/envs/py27/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/library_wq-api-utils/wq_api_utils/tests/tests.py", line 3, in <module>
    from unittest.mock import patch
ImportError: No module named mock
回溯(最近一次呼叫最后一次):
文件“/opt/conda/envs/py27/lib/python2.7/runpy.py”,第174行,在运行模块中
“\uuuuu main\uuuuuuuuuuuuuuuuuuuuuuuuu”,fname,loader,pkg\u name)
文件“/opt/conda/envs/py27/lib/python2.7/runpy.py”,第72行,在运行代码中
run_globals中的exec代码
文件“/library\u wq-api-utils/wq\u api\u utils/tests/tests.py”,第3行,在
从unittest.mock导入修补程序
ImportError:没有名为mock的模块

在这里,我可能会对文档感到困惑,但如果您能帮助我在Python2.7和3.8中运行相同的代码,我将不胜感激。谢谢大家!

Python 2.x

使用此导入:

from mock import patch, MagicMock
Python 3.3+

mock
已包含在
unittest
模块中,可通过以下方式导入:

from unittest.mock import patch, MagicMock
在运行时检查python版本

import sys
if sys.version_info[0] < 3:
    from mock import patch, MagicMock
if sys.version_info[0] > 3:
    from unittest.mock import patch, MagicMock
导入系统 如果系统版本信息[0]<3: 来自模拟导入补丁,MagicMock 如果系统版本信息[0]>3: 从unittest.mock导入补丁,MagicMock 它在做什么

sys.version\u info[0]
是主版本号,其中as
sys.version\u info[1]
将为您提供次版本号


python版本检查将检查它是python
2
还是python
3

一种可能的解决方案是使用try,除了:

试试看:
从unittest.mock导入补丁,MagicMock
除恐怖外:
来自模拟导入补丁,MagicMock

我使用以下代码来防止全局命名空间污染:

导入单元测试
尝试:
导入unittest.mock
除恐怖外:
导入模拟
unittest.mock=mock

谢谢,但这并不能解决我的问题。我需要相同的代码才能与这两个版本兼容-问题的关键是使我能够运行完全相同的代码。@SwaggaTing啊,很抱歉我没有抓住这一部分,我已经编辑了我的答案,以便在运行时包含python版本检查并导入正确的包。谢谢,这就是我的意思!现在我想知道哪个答案更“pythonic”-检查版本,或者使用try/except..try/except看起来更干净。我认为,如果您在发布另一个主要python版本时重新访问代码,您可以从上面的代码中了解到您正在实现一个版本控制,并且可以为该主要版本实现一个新的版本控制。也许使用try/except,为第三个选项实现另一个版本控制不是解决问题的方法。我认为这两个答案对于当前可用的python的两个版本都是可以接受的。我喜欢这样。让我试一试谢谢!