我一直在研究一个应该在我的计算机后台运行的小脚本。我已经有了脚本工作,除了一件事,谷歌搜索和狩猎几个小时没有找到答案。
该文件的扩展名为.pyw,当我从命令提示符运行它时:
pythonw File.pyw
cmd窗口将继续显示,并提供另一个提示,而不会像使用常规.py文件那样启动空闲。
当我双击该文件时,cmd窗口打开和关闭没有问题,就像它应该的那样。这对我来说都是完美的。
但是,我尝试制作一个小批量文件:
cd C:\Users\(my name)\Desktop
pythonw File.pyw
我把它放在windows的启动文件夹中。但是,当我重新启动计算机以查看它是否可行时,它会打开cmd窗口,但不会关闭它。我无法弄清楚为什么。我已经尝试了我能想到的一切,包括将File.pyw直接放在启动文件夹中,并尝试将退出命令放在批处理文件中,如下所示:
cd C:\Users\(my name)\Desktop
pythonw File.pyw
exit
但是,正如你可能猜到的那样,失败了。我尝试将命令直接放在我的代码中,所以在结束之前,它有一行
os.system("exit")
但在意识到这不起作用后,我就把它拿出来了。 (重要细节:代码的最后一行设置为循环它直到程序关闭。这就是为什么我试图使用pyw扩展,所以控制台可以在文件结束前关闭)
接下来,我将批处理文件缩短为只有一行:
pythonw.exe C:\Users\(my name)\Desktop\File.pyw
但它仍然无效。运行批处理文件时,我会在输入命令的情况下打开一个cmd窗口,但它会像常规.py文件一样运行,而不是关闭cmd窗口。
任何人都可以帮我弄清楚当从.batch文件运行命令时控制台不会关闭的原因,但是从命令提示符直接运行时会是什么?
更新:
当我快速按两次“+”时,脚本会添加一个快速键盘快捷键来关闭任务,特别是Google Chrome。这是我的完整代码(减去一些个人信息)
import os
import sys
import pyHook, pythoncom
setting key to be '+' to avoid accidental usage.
def OnKeyBoardEvent(event):
global prevPlus, escPushed
if event.Ascii == 43:
if prevPlus == None:
prevPlus = event.Time
else:
if event.Time - prevPlus <= 1000:
os.system("taskkill /IM chrome.exe")
prevPlus = event.Time
else:
prevPlus = event.Time
elif event.Ascii == 27:
if escPushed == None:
escPushed = event.Time
else:
if event.Time - escPushed <= 1000:
sys.exit()
else:
escPushed = event.Time
getter = pyHook.HookManager()
getter.KeyDown = OnKeyBoardEvent
getter.HookKeyboard()
prevPlus = None
escPushed = None
pythoncom.PumpMessages()
当我从pycharm或cmd运行它时,这一切都很完美,但当我把它放在C:\ Users(我的名字)\ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ Startup和然后尝试一下,没有任何反应。我猜它是因为Windows运行文件并在发生任何事情之前退出,但我真的不确定。我真的需要一个解决方案,让它在启动时运行并接受我的键输入,直到我关闭。
答案 0 :(得分:0)
所以,我的最后一种方法只是链接一个VBS文件(就像评论中提到的那样。)原来我做错了,混合了文件类型,所以我遇到了奇怪的错误。该VBS文件以静默方式调用BAT文件,因此cmd窗口无法显示。那个BAT文件然后调用我的程序,由于某种原因,从cmd调用时比在现场执行时更好。现在,它确实在启动时运行,并且cmd窗口不会出现,所以这是一个很好的修复,但效率很低。
答案 1 :(得分:0)
使用windows&#39; start&#39; .cmd文件中的命令;删除&#39;退出&#39;。
像这样:
cd C:\Users\(my name)\Desktop
start pythonw File.pyw