python - 压缩标准库时如何运行pycharm单元测试?

标签 python unit-testing pycharm maya python-unittest

我一直在尝试将基于 Maya 的 python 项目移植到 PyCharm,但我在运行单元测试时遇到了问题。

Maya 提供了自己的 python 解释器 (mayapy.exe) 和 python stdlib 的压缩版本(在本例中为“Python27.zip”)据我所知,此处的 stdlib 没有什么特别之处,但要运行 native maya 函数,您必须使用 MayaPy 而不是通用的 python。

问题似乎是 jetBrains 测试运行器 (utRunner.py) 想要获取 os.system 并且它正在运行,因为它使用了不允许 zip 文件的特定导入例程。它尝试这样做:

def import_system_module(name):
  if sys.platform == "cli":    # hack for the ironpython
      return __import__(name)
  f, filename, desc = imp.find_module(name)
  return imp.load_module('pycharm_' + name, f, filename, desc)

并因此错误而失败:

 ImportError: No module named os

我认为是因为这是绕过了 zip 导入 Hook 。

one solution posted here ,这基本上是解压标准库 zip。我不愿意这样做,因为我可能需要在我没有管理员权限的机器上运行测试。我也不愿意修补上面的代码,因为我不清楚它如何适应整个测试过程。

那么:如何使用 PyCharm 使用压缩的标准库运行测试,而无需解压缩库或过多调整 PyCharm 安装?

最佳答案

对于潜伏者:我找不到比上面链接的更好的解决方案,因此有必要将 2.7 标准库解压缩到一个松散的文件夹中。不优雅,但它有效。

maya 用户还需要注意另一个问题:PyCharm 不喜欢运行 Maya.standalone 的测试——独立 session 没有正确退出,因此在运行测试时(在更多文件中)调用

 import maya.standalone
 maya.standalone.initialize()

pycharm 测试运行程序会在完成时挂起。经过多次挫折后,我发现向测试代码添加一个 atexit 处理程序将允许独立程序以 PyCharm 可以容忍的方式退出:

def get_out_of_maya():
    try:
       import maya.commands as cmds
       cmds.file(new=True, force=True)
    except:
       pass
    os._exit(0)   # note underscore

import atexit
atexit.register(get_out_of_maya)

这会抢占 Maya 中的 atexit Hook ,并允许测试以 Pycharm 运行程序满意的方式完成。 FWIW,如果您从子进程运行 MayaPy.exe 并以这种方式执行测试,它也会有所帮助。

关于python - 压缩标准库时如何运行pycharm单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24092084/

相关文章:

python - 导入共享库和全局命名空间

python - 有没有更好的方法在 python 项目中设置 sys.path.append ?

javascript - 在 Karma/Jasmine 单元测试中注入(inject) Angular 的 $timeout 服务的实际实现

c# - 带静态值的单元测试

python - 在 Python 3 上向 App Engine 添加预热请求

python - 单元测试模拟 urllib.request.urlretrieve() Python 3 和内部函数

python - pycharm 类型检查器预期类型为 dict,而是得到 'None'

python - Pycharm突然显示 "Unresolved reference"

python - PyCharm 中的 "Inherit global site-packages"是什么意思?

python - 无法使用 python 解析 XML 文件。想要从 python 文件中删除一行。帮我删除该行