Chrome 使用 Webbrowser 模块时出现路径文件问题(非个人问题)

Chrome Path File Issue (Not Personal Issue) while using the Webbrowser Module

所以我最近写了一个小代码来使用 webbrowser 模块输入特定的URL。它适用于我的电脑。但是当我 运行 在我朋友的 PC 上使用相同的代码时,webbrowser 模块无法打开 Chrome。这是我的代码:

import webbrowser

url = 'https://pythonexamples.org'
webbrowser.register('chrome',None,webbrowser.BackgroundBrowser("C://Program Files(x86)//Google//Chrome//Application//chrome.exe"))
webbrowser.get('chrome').open(url)

因此,在进行一些研究后,我们发现 问题出在 Program Files(x86) 上。 Chrome 在我的电脑上打开的原因是因为 Google 文件夹存储在 Program Files(x86) 和我朋友电脑上的 Program Files. 所以我的目的是为此创建一个解决方案,以便我的函数可以在任何 pc 上运行,而不必担心这个路径问题。

在谷歌搜索中我们发现了这个信息:

即将开始,如果是 64 位安装程序,Google Chrome 将默认安装在 Windows 的 C:\Program Files\ 文件夹中. Chrome 安装在 C:\Program Files (x86)\ 文件夹中的 64 位版本将继续工作,并将像以前一样更新。

那么我们如何创建一个代码,首先我们可以确定Google文件夹是在Program Files还是Program Files(x86)中,然后在[=35中注册路径文件=]参数。任何帮助,将不胜感激。 提前致谢:)

更新:我的新代码基于 Markus Rosjat 的解决方案

def get_executable(search_path, executeable_name):
    for sdir, dir, files in os.walk(search_path):
        if executeable_name in files:
            exe = files[files.index(executeable_name)]
            return os.path.join(sdir, exe)

for path in [ 'C:\program files',"C:\program files(x86)"]:
    exe = get_executable(path, 'chrome.exe')
    if exe:
        url = f'https://{website}.com'
        webbrowser.register('chr', None, webbrowser.BackgroundBrowser(exe))
        webbrowser.get('chr').open(url)

代码没有返回任何东西。

以上评论中的简短示例

import webbrowser

url = 'https://www.google.com/'
webbrowser.open(url)

应该尝试打开系统上的默认浏览器。如果您想使用寄存器,请尝试 windows-default 选项

一个好的起点应该是https://docs.python.org/3/library/webbrowser.html

更新

你可以得到一个你想要的浏览器的控制器,但是 bowser 需要在系统上安装。

import webbrowser

url = 'https://www.google.com/'
controller = webbrowser.get('chrome')
controller.open(url)

如果您查看文档,您可以遍历 get 方法的所有可能预设并使用您获得的第一个控制器,但这可能有点太多了。如果你确定有 chrome 那么上面的行应该足够了。

更新了一个简单的函数来查找可执行文件的路径,它应该可以用于此用途。

import os

def get_executable(search_path, executeable_name):
    for sdir,dir,files in os.walk(search_path):
        if executeable_name in files:
            exe = files[files.index(executeable_name)]
            return os.path.join(sdir,exe)

exe = get_executable('C:\program files', 'chrome.exe')

更新路径列表的简单迭代

这是一个简单粗暴的例子

for path in ['C:\program files(x86)', 'C:\program files']:
    exe = get_executable(path, 'opera.exe')
    if exe:
        break

您可以在列表中放置任意多的路径来搜索您的 exe 文件

更新更明确的失败

同样,这只是一个例子,它并不是很有用,但它给出了如何处理事情的想法。我的目的不是解决问题,而是给你进一步调查的方向;)

import os
import webbrowser


class BrowserNotFoundException(Exception):
    pass


def get_executable(search_path, executable_name):
    for sdir, dir, files in os.walk(search_path):
        if executable_name in files:
            exe = files[files.index(executable_name)]
            return os.path.join(sdir,exe)

def search_paths(paths, executable_name):
    for path in paths:
        exe = get_executable(path, executable_name)
        if exe:
            return exe
    raise BrowserNotFoundException(f'{executable_name} is not in the path searched({paths})')

paths =  ['c:\program files(x86)', 'c:\program files']
executable = 'chrome.exe'
url = 'https://google.com'


exe = search_paths(paths,executable)
webbrowser.register('myBrowser', None, webbrowser.BackgroundBrowser(exe))
webbrowser.get('myBrowser').open(url)

干杯

马库斯