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

4 投票
2 回答
1037 浏览
提问于 2025-04-18 08:56

我一直在尝试把一个基于Maya的Python项目移到PyCharm上,但在运行单元测试时遇到了麻烦。

Maya提供了自己的Python解释器(mayapy.exe),里面有一个压缩版的Python标准库(在这个例子中是'Python27.zip')。据我所知,这个标准库没有什么特别的地方,但要使用Maya的原生功能,你必须用MayaPy,而不是普通的Python。

问题似乎出在JetBrains的测试运行器(utRunner.py)想要调用os.system,但它出错了,因为它使用了一种特定的导入方式,这种方式不支持压缩文件。它尝试这样做:

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

我觉得这是因为它绕过了压缩文件的导入机制。

这里有一个解决方案,基本上就是解压标准库的压缩文件。我不太想这样做,因为我可能需要在没有管理员权限的机器上运行测试。我也不太想修改上面的代码,因为我不清楚它在整个测试过程中的作用。

所以:如何在PyCharm中使用压缩的标准库运行测试,而不解压库或对PyCharm的安装做太多修改呢?

2 个回答

0

我最后直接修改了Pycharm的utrunner.py文件。这个文件的开头已经引入了os模块,所以我不明白为什么还要调用import_system_module。其实,import命令本身就能处理zip文件。另外,如果你把maya.standalone放在runner文件里,就不需要在任何测试文件中再调用它了。

#os = import_system_module("os")
#re = import_system_module("re")
import re
try:
  import maya.standalone
  maya.standalone.initialize()
except ImportError:
  pass

我使用的是Pycharm 5.0.1。

2

对于潜水者们:我找不到比上面链接的更好的解决方案,所以我不得不把2.7的标准库解压到一个松散的文件夹里。虽然看起来不太优雅,但确实能用。

还有一个需要注意的地方,特别是对于使用Maya的朋友们:PyCharm不喜欢运行Maya.standalone的测试——因为独立会话没有正确退出,所以当运行调用了

 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钩子,让测试顺利完成,PyCharm的运行器也能满意。如果你是通过子进程运行MayaPy.exe并以这种方式执行测试,这样做也会有帮助。

撰写回答