pyinstaller一个文件--no-console不起作用"致命错误"

时间:2017-10-09 04:52:51

标签: python selenium pyinstaller

我尝试使用pyinstaller的2个选项,一个是控制台,另一个没有。

我使用的是Windows 10,Python 3.5.4,Windows Chrome驱动程序2.33和Selnium 3.6.0以及Pyinstaller 3.3。

没有 控制台的 失败:

以下是 Test.py

的代码
#!python3
from selenium import webdriver

# Chrome Proxy options and disable the Yellow Bar about Chrome being controlled by Automated Software.
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--disable-infobars")
chrome_options.add_argument("--disable-logging")
chrome_options.add_argument("--disable-notifications")
chrome_options.add_argument("--disable-default-apps")
chrome_options.add_argument("--disable-extensions")


# load google.com with the proxy settings and a logging path to a file
driver = webdriver.Chrome(r"D:\Selenium\chromedriver_win32\chromedriver.exe", chrome_options=chrome_options)

# maximise window
driver.maximize_window()

driver.get("https://www.google.com/mail")

以下是具有完全相同代码的pyinstaller命令:

- 使用控制台窗口也可以:

pyinstaller -F -i favicon.ico Test.py

- 没有控制台窗口失败

pyinstaller -F --noconsole -i favicon.ico Test.py

我收到此错误:

*"Failed to execute script error"*

我不确定为什么。

由于

感谢您回复我的回复:

C:\Users\testuser\AppData\Local\Programs\Python\Python35\Lib\site-packages\selenium\webdriver\chrome\service.py

这里没有子进程。

我还检查过:

C:\Users\testuer\AppData\Local\Programs\Python\Python35\Lib\site-packages\selenium\webdriver\common\service.py

在第70行,我添加了stdin = self.log_file的条目,因为它缺少

 try:
            cmd = [self.path]
            cmd.extend(self.command_line_args())
            self.process = subprocess.Popen(cmd, env=self.env,
                                            close_fds=platform.system() != 'Windows',
                                            stdin=self.log_file, stdout=self.log_file, stderr=self.log_file)

使用pyinstaller重新创建:

pyinstaller -F --noconsole  -i favicon.ico Test.py

这创建了exe但是现在控制台窗口出现了......

Python program with selenium(webdriver) Don't Work as single and noconsole exe file (pyinstaller)

3 个答案:

答案 0 :(得分:2)

经过一番搜索,我找到了完整的解决方案: 首先去 -

C:\Python35\Lib\site-packages\selenium\webdriver\common\service.py

更改:

self.process = subprocess.Popen(cmd, env=self.env,
                                            close_fds=platform.system() != 'Windows',
                                            stdout=self.log_file, stderr=self.log_file)

要:

self.process = subprocess.Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=False, creationflags=0x08000000)

现在只需像这样构建你的app.py:

pyinstaller --noconsole --onefile  --noupx   Yourfile.py

答案 1 :(得分:0)

我希望这对某人有帮助

C:\ Users * / user_name / * \ AppData \ Local \ Programs \ Python \ Python36-32 \ Lib \ site-packages \ selenium \ webdriver \ common

添加导入并在“ def start”中进行更改:

从win32process导入CREATE_NO_WINDOW

    try:
        cmd = [self.path]
        cmd.extend(self.command_line_args())
        self.process = subprocess.Popen(cmd, env=self.env,
                                        close_fds=platform.system() != 'Windows',
                                        stdin=self.log_file, stdout=self.log_file, stderr=self.log_file, creationflags=CREATE_NO_WINDOW)
    except TypeError:
        raise

如果出错,请检查pywin32: pip安装pywin32

答案 2 :(得分:0)

首先转到- C:\Python35\Lib\site-packages\selenium\webdriver\common\service.py

然后在def start(self):

def start(self): """ Starts the Service.

    :Exceptions:
     - WebDriverException : Raised either when it can't start the service
       or when it can't connect to the service
    """
    try:
        cmd = [self.path]
        cmd.extend(self.command_line_args())
        self.process = subprocess.Popen(cmd, env=self.env,
                                        close_fds=platform.system() != 'Windows',
                                        stdout=self.log_file,
                                        stderr=self.log_file,
                                        stdin=PIPE,
                                        creationflags=0x08000000)``

只需添加 creationflags = 0x08000000 ,我已经在代码中添加了该位置。 creationflags是一个常量。它将正常工作。

或者, 您也可以将其替换为creationflags=CREATE_NO_WINDOW,然后添加此行代码from win32process import CREATE_NO_WINDOW

就我而言,第一种方法有效。