我正在使用subprocess.Popen用Python启动外部程序。 特别是Cinema 4D中的Python 2.6。
它在Windows上运行正常,但我在mac osx上遇到了问题。
cmd = ['filepath']
p = subprocess.Popen(cmd, shell=False, bufsize=0, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds = False)
pickle.dump(data, p.stdin)
output, error_output = p.communicate()
这反复运作,直到我重新启动C4D,然后它就冻结了一切。然后我需要在Mac上执行'Force Quit'。要重置它以便它再次起作用,我必须删除'filepath'所在的目录,并且当subprocess.Popen运行时让python抛出一个找不到文件的错误。一旦我这样做,我可以重复启动我的子进程程序,直到我再次重新启动C4D。然后,问题又回来了。
close_fds设置为'False',因为在Windows上它需要是管道重定向的那种方式,但在mac上,也许它应该设置为'True'。
现在的问题是,即使我重新启动计算机,'subprocess.Popen'也不会从C4D内的'Console'运行。它冻结了一切。为什么不重启重置一切?我该怎么办才能让事情再次发挥作用呢?
即使这个抛出未找到文件的测试错误也会冻结。
import subprocess
subprocess.Popen(["test1"])
帮助!
答案 0 :(得分:1)
经过无数个小时的测试,问题可以缩小,现在看来C4D(Cinema 4D)中有一个错误会冻结整个程序,包括它的python 2.6,如果你试图使用'subprocess' .Popen'以及其他Python命令,例如'subprocess.call()'在以下情况下:如果你的插件包含某些dynlib,并且它们与你的插件一起放在C4D'plugins'文件夹中。它们可以放在“plugins”文件夹旁边或上方的文件夹中,但不能嵌套在其中的任何位置。
这个问题似乎只出现在Mac版的C4D上。 C4D必须扫描'plugins'文件夹,并因内部存在dynlib而感到困惑。这显然是一个错误,因为开发人员应该能够在其插件中放置任何内容。有人向Maxon报告过。