【问题标题】:Issues with the "subprocess" module in Python 3.9.1 (or 3.9.2) - "subprocess.Popen" doesn't workPython 3.9.1(或 3.9.2)中“subprocess”模块的问题 - “subprocess.Popen”不起作用
【发布时间】:2021-06-05 20:36:19
【问题描述】:

当我的脚本具有.pyw 扩展名时,函数subprocess.Popen 不起作用,但如果我使用.py 扩展名,它就可以工作。其实扩展并不是那么重要,关键是我用终端还是不运行脚本,如果我不使用它就有问题,否则没有问题。

这种奇怪的行为只发生在我的带有 Python 3.9.1 或 3.9.2(当前可用的最后一个版本)的 PC 上。但是我有另一台装有 Python 3.9.0 的电脑,但问题不存在。

我给你举个例子。这里我有两个脚本,下面是第一个名为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()

这是第二个,名为script.py

a=input("give me a number: ")

它们都放在同一个目录中。只有当主脚本的扩展名是.py时,用户才能使用函数subprocess.Popen启动第二个脚本,否则他不能。我该如何解决这个问题?是BUG吗?

我也附上了一个 GIF:

更新! 1 我尝试在虚拟机中安装 Python 3.9.0,并在那里发现了与之前描述的相同的问题!所以,我不明白为什么在我的电脑上,使用相同的版本,脚本可以工作。如果我在终端中输入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 没有t 启动,在终端中我得到了这个输出(我使用 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...

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

【问题讨论】:

  • Pyw 不会打开命令提示符,这就是你使用 pyw 的原因。
  • 是的,如果main_script 使用.pyw 扩展名,subprocess.Popen 函数将无法运行script.py 文件(CLI 软件)。如果我通过终端运行main_script.pywsubprocess.Popen 函数可以工作,但是我只想使用 GUI,我不想使用 CLI 来运行主脚本。 Python 3.9.0 中不存在此问题。
  • 在 python 3.9.0 中,新进程启动时会弹出终端窗口吗?
  • 是的,在 python 3.9.0 中,script.py 在新终端中打开,即使 main_script.pyw 已通过 GUI 打开(我的意思是双击,没有终端)。
  • 将 Python 作为其自身的子进程运行通常只是一种不必要的复杂化。您是否有特殊原因不简单地 import 要运行的代码并在本机调用它?

标签: python tkinter subprocess


【解决方案1】:

我认为这是因为对于.py 文件,Windows 使用python.exe,而对于.pyw 文件,Windows 使用pythonw.exe。问题是sys.executable 具有用于启动主要python 文件的程序的文件位置(python.exe,当扩展名是.pypythonw.exe,当扩展名是.pyw)。所以问题是您正试图使用​​用于.pyw 文件扩展名的python 可执行文件启动.py 程序。

在cmd中:

>>> import sys
>>> sys.executable
'C:\\Program Files\\Python37\\python.exe'

处于空闲状态(没有终端窗口):

>>> import sys
>>> sys.executable
'C:\\Program Files\\Python37\\pythonw.exe'

因此,您必须决定要使用哪个程序(python.exepythonw.exe)。你可以根据文件扩展名来做。

【讨论】:

  • mm.. 使用 Python 3.9.0 我没有问题。我的真实程序使用 Tkinter GUI,它需要运行一些 GUI 或 CLI 脚本。在新的 Python 版本中,它不能再运行 CLI 脚本,我非常想解决这个奇怪的行为。
  • @TurboC 查看 Python 3.9.0 和 3.9.2 的 Python 安装文件夹,并判断是否有 2 个名为 python.exepythonw.exe 的文件。
  • 我的两台 PC 上都有它们(第一台使用 Python 3.9.2,第二台使用 Python 3.9.0)。
【解决方案2】:

一个简单的解决方案是从您的main_script.py 手动打开命令提示符,并在其中执行script.py,如果您确实 将其作为额外进程执行。如果不需要,只需在要执行script.py 的内容的地方添加import script,或者,更好的是,将script.py 中的代码包装成一个函数,在顶部导入script.py main_script.py 并在适当的位置调用该函数。对于第一个解决方案,DataToFish 上有一个示例,其代码与您几乎相同(使用 tkinter GUI a.o.,您必须向下滚动一点才能找到带有 GUI 的示例)。简而言之,您只需从main_script.py 执行cmd /c {sys.executable} script.pyw

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多