如何防止Python构建失败

时间:2017-05-30 06:05:22

标签: python-3.x tkinter build pyinstaller cx-freeze

我正在尝试构建一个我开发的基本Python tkinter应用程序。当我尝试通过命令提示符使用cx_freeze构建应用程序时,我得到以下错误输出:

pip install setup.py

当我尝试使用pyinstaller时,我首先尝试C:\Users\RedCode\PycharmProjects\DatabaseExample>pip install setup.py Collecting setup.py Downloading setup.py-0.1.0.tar.gz Installing collected packages: setup.py Running setup.py install for setup.py ... done Successfully installed setup.py-0.1.0 并得到以下输出:

pyinstaller setup.py

即使它说它成功了,但即使在我的整台机器上使用搜索功能,我也无法在计算机上找到任何内容。

然后我尝试C:\Users\RedCode\PycharmProjects\DatabaseExample>pyinstaller setup.py 495 INFO: PyInstaller: 3.2.1 495 INFO: Python: 3.6.1 496 INFO: Platform: Windows-10-10.0.10240-SP0 501 INFO: wrote C:\Users\RedCode\PycharmProjects\DatabaseExample\setup.spec 503 INFO: UPX is not available. 509 INFO: Extending PYTHONPATH with paths ['C:\\Users\\RedCode\\PycharmProjects\\DatabaseExample', 'C:\\Users\\RedCode\\PycharmProjects\\DatabaseExample'] 509 INFO: checking Analysis 509 INFO: Building Analysis because out00-Analysis.toc is non existent 510 INFO: Initializing module dependency graph... 512 INFO: Initializing module graph hooks... 518 INFO: Analyzing base_library.zip ... Traceback (most recent call last): File "C:\Users\RedCode\AppData\Local\Programs\Python\Python36-32\Scripts\pyinstaller-script.py", line 11, in <module> load_entry_point('PyInstaller==3.2.1', 'console_scripts', 'pyinstaller')() File "c:\users\RedCode\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\__main__.py", line 90, in run run_build(pyi_config, spec_file, **vars(args)) File "c:\users\RedCode\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\__main__.py", line 46, in run_build PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs) File "c:\users\RedCode\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\building\build_main.py", line 788, in main build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build')) File "c:\users\RedCode\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\building\build_main.py", line 734, in build exec(text, spec_namespace) File "<string>", line 16, in <module> File "c:\users\RedCode\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\building\build_main.py", line 212, in __init__ self.__postinit__() File "c:\users\RedCode\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\building\datastruct.py", line 161, in __postinit__ self.assemble() File "c:\users\RedCode\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\building\build_main.py", line 317, in assemble excludes=self.excludes, user_hook_dirs=self.hookspath) File "c:\users\RedCode\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\depend\analysis.py", line 560, in initialize_modgraph graph.import_hook(m) File "c:\users\RedCode\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 1509, in import_hook source_package, target_module_partname, level) File "c:\users\RedCode\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 1661, in _find_head_package target_module_headname, target_package_name, source_package) File "c:\users\RedCode\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\depend\analysis.py", line 209, in _safe_import_module module_basename, module_name, parent_package) File "c:\users\RedCode\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2077, in _safe_import_module module_name, file_handle, pathname, metadata) File "c:\users\RedCode\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2167, in _load_module self._scan_code(m, co, co_ast) File "c:\users\RedCode\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2585, in _scan_code module, module_code_object, is_scanning_imports=False) File "c:\users\RedCode\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2831, in _scan_bytecode global_attr_name = get_operation_arg_name() File "c:\users\RedCode\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 2731, in get_operation_arg_name return module_code_object.co_names[co_names_index] IndexError: tuple index out of range 并得到以下输出错误:

application_title = "Car Database"
main_python_file = "cardb.py"

import sys

from cx_Freeze import setup, Executable

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(
        name = "cardb.py",
        version = "0.1",
        description = "Simple tkinter application",
        executables = [Executable("cardb.py", base = base)])

以下是我的设置文件的代码:

#!/usr/bin/perl

use Net::IMAP::Simple;
use Email::Simple;
use HTTP::Date;


$imap_server = 'someserver';
$imap_user = 'username';
$imap_passwd = 'password';


# Create the object
my $server = Net::IMAP::Simple->new($imap_server);
die "Can't connect to server: $imap_server " unless defined ($server);

# Log on
my $inbox_messages = $server->login($imap_user,$imap_passwd);
die "Login failed (bad username or password)" unless defined  ($inbox_messages);
print "\nThere are $inbox_messages messages in the inbox.\n" if ($verbose >  1);

# Print the subject's of all the messages in the INBOX
my $nm = $server->select('INBOX');

for(my $i = 1; $i <= $nm; $i++){
    if($server->seen($i)){
        print "*";
    } else {
        print " ";
    }

    my $es = Email::Simple->new(join '', @{ $server->top($i) } );

    printf("[%03d] %s\n", $i, $es->header('Subject'));

$server->quit;
__END__

我正在使用cx_Freeze来构建应用程序,如果有帮助的话,我将通过PyCharm-Community 2017.1.1运行Python 3.6.1。我到处搜索,似乎找不到任何有用的东西(看起来对Python 3.6.x的支持非常差)。

如何成功构建我的应用程序?或者至少我如何纠正构建期间发生的这些错误?

1 个答案:

答案 0 :(得分:1)

import sys
import os
from cx_Freeze import setup, Executable
import cx_Freeze
import tkinter
import os.path


base = None

if sys.platform == 'win32':
    base = "Win32GUI"


PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6')
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6')

#This was another style I tried using. If you don't have your python installed #to your path you could try this method. Obviously need to update the URL to #those files 
#os.environ['TCL_LIBRARY'] = r'C:\Users\gardener\Downloads\WinPython-64bit-3.5.3.0Qt5\python-3.5.3.amd64\tcl\tcl8.6'
#os.environ['TK_LIBRARY'] = r'C:\Users\gardener\Downloads\WinPython-64bit-3.5.3.0Qt5\python-3.5.3.amd64\tcl\tk8.6'

executables = [cx_Freeze.Executable("cardb.py", base=base)]


options = {
    'build_exe': {

        'include_files':[
            os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
            os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'),

         ]
    },

}

cx_Freeze.setup(
    name = "cardb",
    options = options,
    version = "0.1",
    description = 'Simple tkinter application',
    executables = executables
)

尝试一下