Python 3.9.1(或 3.9.2)中“subprocess”模块的问题-“subprocess.Popen”不起作用

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) 中,我看到两个文件夹,Python39Python38-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)

我试图在管理员模式下打开终端,但在这种情况下,谷歌浏览器没有启动。从你的角度来看问题出在哪里?

The*_*ard 1

我认为这是因为.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您可以根据文件扩展名来执行此操作。