从Python脚本调用命令提示符时出现问题

2 投票
4 回答
1248 浏览
提问于 2025-04-16 16:52

我想要一些帮助,想从一个Python脚本中调用命令提示符,并且传递一些参数给命令提示符。

我使用pyqt4来开发用户界面,在界面上有一个运行按钮。当我点击这个运行按钮时,我希望能够打开命令提示符,并把一个脚本名称作为参数传递过去。

self.connect(run_button, SIGNAL('clicked()'), self.runscript) # this is my run button  signal and i'm calling the runscript() 

def runscript(self):
    print 'Inside Run Script'
    os.chdir('C:\PerfLocal_PAL')
    try:
        subprocess.call(['C:\windows\system32\cmd.exe'])
    except:
        print 'Exception Caused.'

但是,当我点击运行按钮时,应用程序就崩溃了,根本没有打开命令提示符。我尝试使用os.system,结果也是一样。

另外,我还想知道如何把参数传递给调用的函数?

任何帮助都非常感谢。

谢谢,

4 个回答

0

一个问题是,subprocess.call 这个命令会一直等到它完成才会继续执行,而 cmd.exe 这个程序在你退出之前是不会返回的。这就解释了“只是死掉了”的情况,但可能没有解释为什么控制台从来没有出现。可以先试试这个:

subprocess.Popen(['C:\Windows\system32\cmd.exe'])

这个至少不会让程序卡住。如果你能让它出现,试试你的参数,比如这样:

subprocess.Popen(['C:\Windows\system32\cmd.exe', 'program_or_script', 'arg1'])
0

你的信号连接和子进程调用看起来没问题。把你的 chdir 调用改成:

  os.chdir(r'C:\PerfLocal_PAL')

我猜你遇到的错误是这样的(当你从命令提示符启动你的应用程序时):

WindowsError: [Error 123] The filename, directory name, or volume label syntax is incorrect: 'C:\PerfLocal_PAL'
2

在Windows上正确地定义Python中的文件路径,你需要做以下三件事中的一件:

  • 使用正斜杠:"C:/PerfLocal_PAL"(Python可以理解正斜杠,不管你用什么平台)
  • 使用原始字符串:r"C:\PerfLocal_PAL"
  • 转义反斜杠:"C:\\PerfLocal_PAL"

这会影响到你的chdir调用和subprocess.call的使用。

不过,你还会遇到一些麻烦,因为你的父进程是一个图形界面应用程序,所以没有控制台流来处理stdinstdoutstderr。你可以尝试使用以下方法来打开一个完全独立的命令窗口:

subprocess.call("start", shell=True)

你可能还想使用"/D"这个参数来设置你的工作目录,而不是改变父进程的当前工作目录:

subprocess.call(["start", "/DC:\\PerfLocal_PAL"], shell=True)

撰写回答