【发布时间】: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)中,我看到了两个文件夹,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 没有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.pyw,subprocess.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