2016-05-15 75 views
0

重复编辑:不,我做到了,但它不想启动Firefox。 我正在制作一个cortana/siri助理的东西,我想让它说我打电话的时候打开网页浏览器。所以我做了if部分,但我只是需要它启动firefox.exe我尝试了不同的东西,我得到一个错误。这是代码。请帮忙!它的工作原理与打开记事本,但没有Firefox的..如何在Python中打开外部程序

#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']) 
+2

使用'firefox.exe'的绝对路径。 – fsp

+0

可能的重复[如何从python执行程序? os.system失败,由于路径中的空格](http://stackoverflow.com/questions/204017/how-do-i-execute-a-program-from-python-os-system-fails-due-to-spaces -in-path) –

+1

记事本通常位于PATH变量下的system32文件夹中,但firefox不太可能。 – YOU

回答

1

简短的回答是,os.system不知道在哪里可以找到firefox.exe

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

import subprocess 

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

心灵的\\firefox.exe之前!如果你会使用\f,巨蟒将其解释为换页:

>>> 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(或在运行实例中创建一个新的选项卡)。


一个更完整的例子是我通过github发布的open实用程序。这使用正则表达式来匹配文件扩展名到程序来打开这些文件。然后它使用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) 
+0

(我也复制了我的firefox位置的确切路径)好吧,我完成了子程序代码,当我尝试从它启动Firefox时,它说:Traceback(最近调用最后一个): 文件“Danbot.py “,第33行,在 subprocess.Popen(['C:\ Program Files \ Mozilla Firefox \ firefox.exe']) 文件”c:\ hp \ bin \ python \ lib \ subprocess.py“,第593行,in __init__ errread,errwrite) WindowsError:[错误22]文件名称,目录名称或卷的文件“c:\ hp \ bin \ python \ lib \ subprocess.py”,行793,在_execute_child中 startupinfo) 标签语法不正确 – noone

+0

@Dan据猜测,这可能是因为'\ f'被Python解释为换页的转义序列。将'\ f'改为'\\ f'。 –

+0

什么\ f?我没有使用\ f ..的任何东西? – noone

相关问题