cx_freeze 可执行文件与 Geckodriver 不兼容。

问题描述 投票:0回答:1

我正在开发一个GUI桌面应用程序,让用户控制一个Web scraper。我有两个可执行文件,一个运行Selenium scraper (Py27),另一个运行GUI,GUI启动和停止scraper,使用 subprocess.Popen (Python 38)。不幸的是,在两个应用程序中使用相同的Python版本对我来说现在是不可能的。虽然我们似乎没有因为Python版本的差异而遇到环境问题。

我在Windows上,使用Selenium 3.141,Geckodriver 0.26,cx_Freeze 5和Firefox 77。

我能够手动运行这两个exe,没有问题,但是当我试图通过GUI exe运行scraper exe时,它陷入了一个无限循环,即创建一个包含User.js的tmp目录,打开geckodriver命令提示符,然后关闭并重新开始。最后,它不断地生成越来越多的tmp目录,直到我杀死GUI窗口。跟踪回溯告诉我一些事情--Geckodriver遇到了一个权限错误,应用程序在建立主目录时遇到了问题。

我已经测试过使用Popen启动一个scrape进程,所以这不是问题所在。

当我手动运行并转储Firefox选项时,并与通过GUI运行时的Firefox选项进行比较,有一些差异。这是手动(成功)运行时的FF配置文件。

'userPrefs': 'c:\\users\\atadmin\\appdata\\local\\temp\\tmpqctvna\\user.js',
'profile_dir': 'c:\\users\\atadmin\\appdata\\local\\temp\\tmpqctvna',
'extensionsDir': 'c:\\users\\atadmin\\appdata\\local\\temp\\tmpqctvna\\extensions',

而这是不成功的GUI运行时的配置文件

'userPrefs': 'c:\\users\\atadmin\\documents\\aeleads-master\\aeleads-portal-testing\\build\\exe.win-amd64-3.8\\tmpu9ktpl\\user.js',
'profile_dir': 'c:\\users\\atadmin\\documents\\aeleads-master\\aeleads-portal-testing\\build\\exe.win-amd64-3.8\\tmpu9ktpl',
'extensionsDir': 'c:\\users\\atadmin\\documents\\aeleads-master\\aeleads-portal-testing\\build\\exe.win-amd64-3.8\\tmpu9ktpl\\extensions',

这是最新的跟踪结果

 Can't determine home directory

 utils.tss_logging: Logging initailizing with None/None


 Error: Traceback (most recent call last):

   File "li_scraper.py", line 63, in run_scraper

   File "C:\Users\atadmin\Documents\aeleads-master\aeleads-portal-testing\scrape\scraper.py", line 394, in collection

     self.login()

   File "C:\Users\atadmin\Documents\aeleads-master\aeleads-portal-testing\scrape\scraper.py", line 85, in login

     driver = self._get_driver(use_proxy=self.use_proxy)

   File "C:\Users\atadmin\Documents\aeleads-master\aeleads-portal-testing\scrape\scraper.py", line 622, in _get_driver

     use_proxy=use_proxy, reserve_proxy=False)

   File "C:\Users\atadmin\Documents\aeleads-master\aeleads-portal-testing\lib\webdrivers.py", line 164, in open_webdriver

     capabilities=capabilities, log_path="C:\\Users\\atadmin\\Documents\\aeleads-master\\geckodriver.log")

   File "C:\Python27\Py27\lib\site-packages\selenium\webdriver\firefox\webdriver.py", line 174, in __init__

     keep_alive=True)

   File "C:\Python27\Py27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 157, in __init__

     self.start_session(capabilities, browser_profile)

   File "C:\Python27\Py27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 252, in start_session

     response = self.execute(Command.NEW_SESSION, parameters)

   File "C:\Python27\Py27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute

     self.error_handler.check_response(response)

   File "C:\Python27\Py27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response

     raise exception_class(message, screen, stacktrace)

 WebDriverException: Message: permission denied

似乎cx_Freeze创建了自己的构建环境 可能导致我失去了用户,基于权限错误。我对Python相当陌生。

python selenium cx-freeze geckodriver
1个回答
0
投票

我想明白了。当把环境传递到Popen时,我传递的是一个不包括TEMP路径的剥离环境。我传入了完整的环境,然后修改了需要修改的变量,现在可以用了。

© www.soinside.com 2019 - 2024. All rights reserved.