我有一个 Windows 应用程序,它是通过运行 .bat 文件启动的。这个 .bat 文件在启动 .exe 之前调用不同的东西。
问题是,一旦脚本结束,应用程序也会结束。我认为这个问题与 .exe 需要通过该 .bat 文件启动这一事实有关。
我用Python尝试过的东西:
subprocess.Popen(['cd','path\\to\\the\\script', '&&', 'start.bat' ], shell=True, text=True | subprocess.DETACHED_PROCESS )
time.sleep(10)
睡眠结束后,启动的 .exe 将关闭。
我还尝试了不同的子流程参数,例如
subprocess.CREATE_NEW_PROCESS_GROUP
。
我也尝试过:
os.system('cd "path\\to\\the\\script" && "start.bat"')
是否有某种方法可以启动该 .bat 文件并使其“真正”保留,因为我认为问题是,当 .bat 文件完成其工作时,它会退出,这会以某种方式把事情搞砸。
调用 .bat 之后在 Python 中创建无限循环听起来不是一个好的解决方案。
我无法直接调用.exe。
.exe 必须永远保留。
运行 .exe 后,您可以检查它是否运行(参见此线程)
这将类似于:
import psutil
while True:
if "YourEXEProcess" in (p.name() for p in psutil.process_iter(attrs=['name'])):
time.sleep(some appropriate amount of time)
else:
break
end script
首先:请不要将您的bat文件命名为“Start.bat”,这可能会导致一些问题,因为start是一个命令,在执行批处理文件时,可能会导致无限循环<3
第二: 这似乎不是一个Python问题,看来批处理文件应该处理这个问题。因此,您可以使用此行在批处理文件中解决此问题:
call "cmd /c start notepad.exe"
只需将 notepad.exe 替换为您的 exe 文件名
第三:我制作了这个Python脚本:
import subprocess
subprocess.Popen(r"D:\draw\StartApp.bat")
这批:
cd /D "%~dp0"
call "cmd /c start draw.exe"
按例外情况工作。希望也能帮助到你。
最后更多关于“呼叫”和“开始”的信息:
call在同一个解释器实例中运行给定的脚本,因此它只能用于批处理文件,但它允许被调用的脚本使用set修改调用者的环境。在 Windows NT 中,call 还允许将标签作为子例程进行调用;例如打电话:foo。
另一方面,start使用ShellExecute()函数,因此它几乎可以用来打开Windows本身可以打开的所有内容,包括文档、其他文件,甚至Internet URL。 start 还可以选择打开单独的控制台窗口、使用不同的进程优先级以及运行程序而不等待程序完成。但是,如果您将 start 与批处理文件一起使用,它将在单独的解释器中运行,并且调用者不会看到对环境的任何修改。