我正在尝试在 Windows 8.1 上安装 ansicon。我提取了文件并达到了我需要调用的级别ansicon -i
。当我在我的 cmd 中键入它并运行运行良好的 python 脚本但是当我从 python 调用 t 时os.system('ansicon -i')
,它不起作用并且似乎它对 cmd 没有任何影响。
为什么os.system('ansicon -i')
不起作用,我可以在 python 中使用什么替代方法?
首先-i
,真正起作用的不是旗帜。-i
只告诉它自己添加到 AutoRun。暗示的-p
标志-i
是真正起作用的:-p
告诉它将 DLL 注入父进程,这就是问题所在:当你使用时os.system
,你生成一个 shell,然后运行你给它的命令。但是你让 Python 正在cmd
运行ansicon
,并且ansicon
会注入到cmd
中,然后cmd
,完成它的工作后,将退出。
而不是使用os.system
,使用subprocess
模块,例如:
subprocess.check_call(['ansicon', '-p'])
subprocess
模块(与 不同)将os.system
直接执行命令,中间没有外壳(除非您通过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))