【问题标题】:Ansicon doesn't install from python but only from cmdAnsicon 不是从 python 安装,而是从 cmd 安装
【发布时间】:2015-02-22 20:50:56
【问题描述】:
我正在尝试在 Windows 8.1 上安装 ansicon。我提取了文件并达到了需要调用ansicon -i 的级别。当我在我的 cmd 中键入它并运行 python 脚本时效果很好,但是当我通过 os.system('ansicon -i') 从 python 调用 t 时,它不起作用并且似乎对 cmd 没有任何影响。
为什么os.system('ansicon -i') 不起作用,我可以在 python 中使用什么替代方法?
【问题讨论】:
标签:
python
windows
cmd
ansicon
【解决方案1】:
首先,真正起作用的不是 -i 标志。 -i 只告诉它将自己添加到 AutoRun。 -i 所暗示的 -p 标志是真正起作用的:-p 告诉它将一个 DLL 注入到父进程中,这就是问题所在:当你使用 os.system 时,你会生成一个 shell,它然后运行你给它的命令。但是你让 Python 运行 cmd 运行 ansicon,ansicon 将注入到 cmd,然后 cmd 完成工作,将退出。
不要使用os.system,而是使用subprocess模块,例如:
subprocess.check_call(['ansicon', '-p'])
subprocess 模块(与os.system 不同)将直接执行命令,中间没有shell(除非您传递shell=True)。然后 Python 将生成 ansicon,ansicon 将根据需要注入 Python。
也就是说,与其让ansicon 将自己注入 Python,Python 可能只加载 DLL 本身,避免一些困难:
import sys
import math
import ctypes
bitness = 1 << round(math.log2(round(math.log2(sys.maxsize + 1))))
ctypes.WinDLL('ANSI{}.DLL'.format(bitness))