Tur*_*boC 9 python subprocess tkinter
当我的脚本有.pyw扩展名时,该功能subprocess.Popen不起作用,但如果我使用.py扩展名,它就起作用了。其实扩展不是那么重要,重点是我是否使用终端运行脚本,如果我不使用它我有问题,否则没有问题。
这种奇怪的行为仅发生在我使用 Python 3.9.1 或 3.9.2(当前可用的最后一个版本)的 PC 中。但是,我有另一台装有 Python 3.9.0 的 PC,并且该问题不存在。
我给你举个例子。这里我有两个脚本,下面是第一个名为main_script.pyw:
from tkinter import *
from tkinter import ttk
import sys, subprocess
def MyFunction():
subprocess.Popen(["start", sys.executable, "script.py"], shell=True)
parent=Tk()
parent.geometry("300x250+370+100")
parent.title("Test")
TestButton=ttk.Button(parent, text="start", width=16, command=MyFunction)
TestButton.place(x=10, y=10)
parent.mainloop()
Run Code Online (Sandbox Code Playgroud)
这是第二个名为script.py:
a=input("give me a number: ")
Run Code Online (Sandbox Code Playgroud)
两者都放在同一个目录下。subprocess.Popen只有当主脚本的扩展名是 时.py,用户才能使用该函数启动第二个脚本,否则不能。我该如何解决这个问题?是BUG吗?
我也附上了一个GIF:
更新!1
我尝试在虚拟机中安装 Python 3.9.0,在那里我发现了之前描述的相同问题!所以,我不明白为什么在我的 PC 中,使用相同版本的脚本可以工作。如果我python --version在终端中输入,则输出为Python 3.9.0. 这是另一个 GIF 向您展示它的工作原理:
在安装路径 ( C:\Users\USER_NAME\AppData\Local\Programs\Python) 中,我看到两个文件夹,Python39和Python38-32. 可能第二个是旧安装的垃圾,我不知道,但也许它有助于使脚本工作。你怎么认为?
我只想通过 Tkinter 运行 CLI 脚本,就像您在上一个 GIF 中看到的那样(当然不使用终端)。我怎样才能达到我的目标?
更新!2
我不确定,但也许是 Windows 问题。我尝试使用subprocess.Popen(["start", sys.executable, "script.py"], shell=True)指令运行谷歌浏览器(在你必须在 Chrome 安装文件夹中打开终端之前C:\Program Files\Google\Chrome\Application),它只能在我的电脑上运行,我从来没有遇到过问题,但另一个 Chrome 没有启动,并且在终端我得到了这个输出(我使用 ConEmu 作为终端):
>>> subprocess.Popen(["start", sys.executable, "chrome.exe"], shell=True)
<Popen: returncode: None args: ['start', 'C:\\Users\\aquer\\AppData\\Local\\...>
SyntaxError: Non-UTF-8 code starting with '\x83' in file C:\Program Files\Google\Chrome\Application\chrome.exe on line 2, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
Current directory:
C:\Program Files\Google\Chrome\Application
Command to be executed:
"C:\Users\USER_NAME\AppData\Local\Programs\Python\Python39\python.exe" chrome.exe
ConEmuC: Root process was alive less than 10 sec, ExitCode=1.
Press Enter or Esc to close console...
Run Code Online (Sandbox Code Playgroud)
我试图在管理员模式下打开终端,但在这种情况下,谷歌浏览器没有启动。从你的角度来看问题出在哪里?
我认为这是因为.pyWindows 使用的文件python.exe和.pywWindows 使用的文件pythonw.exe。问题是sys.executable用于启动主 python 文件的程序的文件位置(python.exe当扩展名是 时.py以及pythonw.exe当扩展名是 时.pyw)。所以问题是您正在尝试.py使用用于.pyw文件扩展名的 python 可执行文件来启动程序。
在命令中:
>>> import sys
>>> sys.executable
'C:\\Program Files\\Python37\\python.exe'
Run Code Online (Sandbox Code Playgroud)
在 IDLE 中(没有终端窗口):
>>> import sys
>>> sys.executable
'C:\\Program Files\\Python37\\pythonw.exe'
Run Code Online (Sandbox Code Playgroud)
因此,您必须决定要使用哪个python.exe程序。pythonw.exe您可以根据文件扩展名来执行此操作。