Windows批处理如何使用管道启动Python脚本

3
我想创建一个批处理脚本或计划任务来运行以下命令:
pythonw manage.py runserver >nul

如果我从命令提示符中编写它,那么它将运行并返回提示符,但是如果我尝试使用批处理文件或计划任务运行它,它将打开一个窗口并将自己锁定在该命令中。 我将通过添加最后的“退出”来关闭窗口,但除非我在任务管理器中终止进程,否则它将被锁定在第一个命令中。

我该如何做? 如果在正常cmd中起作用,为什么在.bat或.cmd文件中不起作用?


1
我不懂Python,但是pythonw是一个GUI程序,因此无法访问启动它的控制台。因此,">nul"是没有意义的。然而,你的具体问题是其他方面的 - 在批处理中,CMD等待GUI程序退出(在交互式CMD中,CMD仅等待控制台程序)。请参阅“start /?”以获取帮助(它解释了使用和不使用“start”启动程序的方法 - 与Windows NT4相比,新行为来自Windows 2000)。你可能应该使用“python”,但是如果你想在不为其设计的控制台中使用GUI python,请参阅“start /w”。 - user6017774
带有">nul"的部分是因为manage.py是一个Django脚本,不应该以这种方式运行,并且在您使用它创建的Web服务器执行的每个操作中都使用stdout。这是一种解决方法,可以使Django开发服务器在启动时无需控制台和日志即可开始工作,仅用于硬核测试。 - fdzworkzone
1
我的意思是 start 而不是 /w - user6017774
1个回答

1

好的,经过更多的测试,我找到了有效的方法。很抱歉在没有进行更多搜索和测试的情况下提出问题。

以下是有效的方法:

CMD /c start "" /B path\to\pythonw.exe path\to\manage.py runserver > nul ^& exit

在一个.cmd文件中。 执行该文件可以正确启动Django开发Web服务器,而运行该.cmd文件的定时任务也会启动服务器。

如果只使用start "" /B path\to\pythonw.exe path\to\manage.py runserver > nul会发生什么? /B是必需的,以强制cmd.exe设置stdout句柄,但为什么需要cmd /c ... ^& exit? pythonw.exe不使用控制台,所以不应该有问题;批处理应该继续并退出。 start "" /B pythonw.exe -c "import time;time.sleep(60)" >nul对我来说很好用。如果我附加调试器,我可以看到@$peb->ProcessParameters->StandardOutputnul设备,而StandardInputStandardError未设置为NULL - Eryk Sun
嗯,我不是很清楚为什么需要它,但我知道如果没有它,当我启动它时,它会打开一个命令窗口并且除非我手动关闭它,否则它不会关闭。此外,问题出在manage.py的工作方式上。 - fdzworkzone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接