cx_freeze 可执行文件无法与 Geckodriver 配合使用

Posted

技术标签:

【中文标题】cx_freeze 可执行文件无法与 Geckodriver 配合使用【英文标题】:cx_freeze executable won't play nice with Geckodriver 【发布时间】:2020-06-12 12:15:47 【问题描述】:

我正在开发一个 GUI 桌面应用程序,让用户可以控制网络抓取工具。我有两个可执行文件,一个运行 Selenium 刮板(Py27),一个运行 GUI,它使用 subprocess.Popen(Python 38)启动和停止刮板。不幸的是,我现在无法在两个应用程序中使用相同的 Python 版本。尽管由于 Python 版本差异,我们似乎没有遇到环境问题。

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

我可以毫无问题地手动运行这两个 exe,但是当我尝试通过 GUI exe 运行刮板 exe 时,它​​陷入了无限循环,即创建包含 User.js 的 tmp 目录,打开 geckodriver 命令提示,然后关闭并重新开始。它最终会不断生成越来越多的这些 tmp 目录,直到我终止 GUI 窗口。回溯告诉我一些事情——Geckodriver 遇到权限错误,应用程序无法建立主目录。

我已经测试过使用 Popen 启动抓取过程,所以这不是问题。

当我手动运行它并转储 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 还很陌生。

【问题讨论】:

顺便说一句,我在***目录的路径中有 Geckodriver。我也尝试将它包含在 cx_Freeze 构建目录中,但没有成功。与firefox exe相同 【参考方案1】:

想通了。将环境传递给 Popen 时,我传递了一个不包含 TEMP 路径的剥离环境。我在我的完整环境中传递,然后更改了需要更改的变量,现在它可以工作了。

【讨论】:

以上是关于cx_freeze 可执行文件无法与 Geckodriver 配合使用的主要内容,如果未能解决你的问题,请参考以下文章

CX_Freeze 可执行文件给出“无法加载文件系统编解码器”错误

cx_freeze 无法构建 numpy 可执行文件

无法使用 virtualenv 和 cx_Freeze 将 pygame 转换为可执行文件

使用 python 3.7 PyQt5 和 cx_Freeze 创建可执行文件,但 DLL 无法加载

如何将 cx_Freeze 可执行文件的 .pyd 和子文件夹与可执行文件分开放在一个文件夹中

cx_Freeze 无法包含 Cython .pyx 模块