当前位置: 首页 > 面试题库 >

如何在Python中打开外部程序

云胤
2023-03-14
问题内容

重复编辑:不,我这样做了,但是它不想启动Firefox。我正在做一个cortana /
siri助手,我想让我说些什么时说打开Web浏览器。因此,我已经完成了if部分,但是我只需要启动它来启动firefox.exe,就尝试了其他不同的操作,但出现错误。这是代码。请帮忙!它可以与打开记事本一起使用,但不适用于Firefox。

#subprocess.Popen(['C:\Program Files\Mozilla Firefox\firefox.exe']) opens the app and continues the script
#subprocess.call(['C:\Program Files\Mozilla Firefox\firefox.exe']) this opens it but doesnt continue the script

import os
import subprocess

print "Hello, I am Danbot.. If you are new ask for help!" #intro

prompt = ">"     #sets the bit that indicates to input to >

input = raw_input (prompt)      #sets whatever you say to the input so bot can proces

raw_input (prompt)     #makes an input


if input == "help": #if the input is that
 print "*****************************************************************" #says that
 print "I am only being created.. more feautrues coming soon!" #says that
 print "*****************************************************************" #says that
 print "What is your name talks about names" #says that
 print "Open (name of program) opens an application" #says that
 print "sometimes a command is ignored.. restart me then!"
 print "Also, once you type in a command, press enter a couple of times.."
 print "*****************************************************************" #says that

raw_input (prompt)     #makes an input

if input == "open notepad": #if the input is that
 print "opening notepad!!" #says that
 print os.system('notepad.exe') #starts notepad

if input == "open the internet": #if the input is that
 print "opening firefox!!" #says that
 subprocess.Popen(['C:\Program Files\Mozilla Firefox\firefox.exe'])

问题答案:

简短的答案是os.system不知道在哪里找到firefox.exe

一种可能的解决方案是使用完整路径。并且建议使用该subprocess模块:

import subprocess

subprocess.call(['C:\Program Files\Mozilla Firefox\\firefox.exe'])

注意\\之前firefox.exe!如果您使用\f,Python会将其解释为换页:

>>> print('C:\Program Files\Mozilla Firefox\firefox.exe')
C:\Program Files\Mozilla Firefox
                                irefox.exe

当然,这条道路是不存在的。:-)

因此,请转义反斜杠或使用原始字符串:

>>> print('C:\Program Files\Mozilla Firefox\\firefox.exe')
C:\Program Files\Mozilla Firefox\firefox.exe
>>> print(r'C:\Program Files\Mozilla Firefox\firefox.exe')
C:\Program Files\Mozilla Firefox\firefox.exe

请注意,使用os.systemsubprocess.call将停止当前应用程序,直到启动的程序完成。因此,您可能想使用它subprocess.Popen。这将启动外部程序,然后继续执行脚本。

subprocess.Popen(['C:\Program Files\Mozilla Firefox\\firefox.exe', '-new-tab'])

这将打开Firefox(或在运行的实例中创建一个新选项卡)。

一个更完整的示例是我open通过github发布的实用程序。这使用正则表达式将文件扩展名与打开这些文件的程序进行匹配。然后使用它subprocess.Popen在适当的程序中打开那些文件。作为参考,我在下面添加了当前版本的完整代码。

请注意,该程序是在考虑类似UNIX的操作系统的情况下编写的。在ms-windows上,您可能会从注册表中获取文件类型的应用程序。

"""Opens the file(s) given on the command line in the appropriate program.
Some of the programs are X11 programs."""

from os.path import isdir, isfile
from re import search, IGNORECASE
from subprocess import Popen, check_output, CalledProcessError
from sys import argv
import argparse
import logging

__version__ = '1.3.0'

# You should adjust the programs called to suit your preferences.
filetypes = {
    '\.(pdf|epub)$': ['mupdf'],
    '\.html$': ['chrome', '--incognito'],
    '\.xcf$': ['gimp'],
    '\.e?ps$': ['gv'],
    '\.(jpe?g|png|gif|tiff?|p[abgp]m|svg)$': ['gpicview'],
    '\.(pax|cpio|zip|jar|ar|xar|rpm|7z)$': ['tar', 'tf'],
    '\.(tar\.|t)(z|gz|bz2?|xz)$': ['tar', 'tf'],
    '\.(mp4|mkv|avi|flv|mpg|movi?|m4v|webm)$': ['mpv']
}
othertypes = {'dir': ['rox'], 'txt': ['gvim', '--nofork']}


def main(argv):
    """Entry point for this script.

    Arguments:
        argv: command line arguments; list of strings.
    """
    if argv[0].endswith(('open', 'open.py')):
        del argv[0]
    opts = argparse.ArgumentParser(prog='open', description=__doc__)
    opts.add_argument('-v', '--version', action='version',
                      version=__version__)
    opts.add_argument('-a', '--application', help='application to use')
    opts.add_argument('--log', default='warning',
                      choices=['debug', 'info', 'warning', 'error'],
                      help="logging level (defaults to 'warning')")
    opts.add_argument("files", metavar='file', nargs='*',
                      help="one or more files to process")
    args = opts.parse_args(argv)
    logging.basicConfig(level=getattr(logging, args.log.upper(), None),
                        format='%(levelname)s: %(message)s')
    logging.info('command line arguments = {}'.format(argv))
    logging.info('parsed arguments = {}'.format(args))
    fail = "opening '{}' failed: {}"
    for nm in args.files:
        logging.info("Trying '{}'".format(nm))
        if not args.application:
            if isdir(nm):
                cmds = othertypes['dir'] + [nm]
            elif isfile(nm):
                cmds = matchfile(filetypes, othertypes, nm)
            else:
                cmds = None
        else:
            cmds = [args.application, nm]
        if not cmds:
            logging.warning("do not know how to open '{}'".format(nm))
            continue
        try:
            Popen(cmds)
        except OSError as e:
            logging.error(fail.format(nm, e))
    else:  # No files named
        if args.application:
            try:
                Popen([args.application])
            except OSError as e:
                logging.error(fail.format(args.application, e))


def matchfile(fdict, odict, fname):
    """For the given filename, returns the matching program. It uses the `file`
    utility commonly available on UNIX.

    Arguments:
        fdict: Handlers for files. A dictionary of regex:(commands)
            representing the file type and the action that is to be taken for
            opening one.
        odict: Handlers for other types. A dictionary of str:(arguments).
        fname: A string containing the name of the file to be opened.

    Returns: A list of commands for subprocess.Popen.
    """
    for k, v in fdict.items():
        if search(k, fname, IGNORECASE) is not None:
            return v + [fname]
    try:
        if b'text' in check_output(['file', fname]):
            return odict['txt'] + [fname]
    except CalledProcessError:
        logging.warning("the command 'file {}' failed.".format(fname))
        return None


if __name__ == '__main__':
    main(argv)


 类似资料:
  • 问题内容: 我想知道如何根据文件扩展名在记事本和图片查看器等程序中打开文件。我在Windows上使用Python 3.3。 我已经做过一些研究,人们提到了一个名为的模块,但是当我尝试导入该模块时,我收到一个ImportError。 这是我到目前为止的内容: 我还将拥有需要在记事本中打开的HTML和JSON文件。 问题答案: 使用此命令可使用默认程序打开任何文件: 如果您确实想使用某个程序,例如记事

  • 问题内容: 我有一个Raspberry Pi,它存储用于家庭酿造活动的温度数据。我在计算机上制作一个Spring MVC应用程序,我想点击数据。我的Pi和计算机都在本地网络上。我可以完美地通过SSH和FTP进入RPi。 导致“无法连接到‘192.168.1.102’上的MySQL服务器”。 很明显,我的Java应用程序没有连接。 返回默认端口3306。 是否必须启用某个设置才能允许远程连接到MyS

  • 我想打开一个PDF文件时,用户点击一个按钮。目前,我正在使用这段代码来实现这一点: 但不管用。 当我选择使用Adobe Acrobat时,我会得到一条显示为Toast的消息,它说 当我尝试使用Drive PDF Viewer时,我得到 PDF文件存储在 问题出在哪里? 编辑 现在我使用的是以下代码: 但当我尝试通过点击按钮打开PDF时,应用程序崩溃了。 这是我得到的日志: 这是我的课: } 有人能

  • 您好,我想在webview或外部应用程序中显示pdf文件 1)我使用此url<代码>https://docs.google.com/gview?embedded=true 以下是完整的urlhttps://docs.google.com/gview?embedded=true

  • 问题内容: 如何打开一个Excel文件以便在Python中读取? 例如,我已经使用read命令打开了文本文件。如何为Excel文件执行此操作? 问题答案: 编辑: 在较新版本的pandas中,您可以将工作表名称作为参数传递。 检查文档以获取有关如何通过的示例sheet_name:https : //pandas.pydata.org/pandas-docs/stable/generation/pa