我一直在尝试将基于 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/