3

我一直在研究一个应该在我的计算机后台运行的小脚本。我已经让脚本工作了,除了一件事,数小时的谷歌搜索和狩猎还没有找到答案。

该文件具有 .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(my name)\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 然后尝试它时出来,什么都没有发生。我猜这是因为 Windows 会在任何事情发生之前运行该文件并退出它,但我真的不确定。我真的需要一个解决方案,让它在启动时运行并接受我的关键输入,直到我关闭。

4

2 回答 2

3

在 .cmd 文件中使用 windows 'start' 命令;删除“退出”。
像这样:

cd C:\Users\(my name)\Desktop
start pythonw File.pyw
于 2017-10-25T15:32:54.267 回答
1

所以,我最后的方法是链接一个 VBS 文件(就像评论中提到的那样。)结果证明我做错了,混合了文件类型,所以我遇到了奇怪的错误。那个 VBS 文件默默地调用了一个 BAT 文件,所以 cmd 窗口没有出现。然后那个 BAT 文件调用了我的程序,由于某种原因,当从 cmd 调用时,它比在现场执行时运行得更好。现在,它确实在启动时运行,并且没有出现 cmd 窗口,所以这是一个很好的修复,虽然效率低下。

于 2016-01-02T03:18:07.667 回答