1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
#-----------------------------------------------------------------------------
# Copyright (c) 2005-2023, PyInstaller Development Team.
#
# Distributed under the terms of the GNU General Public License (version 2
# or later) with exception for distributing the bootloader.
#
# The full license is in the file COPYING.txt, distributed with this software.
#
# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception)
#-----------------------------------------------------------------------------
# Compare attributes of ElementTree (cElementTree) module from frozen executable with ElementTree (cElementTree)
# module from standard python.
import copy
import os
import subprocess
import sys
import xml.etree.ElementTree as ET
import xml.etree.cElementTree as cET
# We expect to receive text file with python interpreter parameters as the first command-line argument.
if len(sys.argv) != 2:
print(f"use: {sys.argv[0]} <parameters-file>")
raise SystemExit(1)
with open(sys.argv[1], 'r', encoding='utf-8') as fp:
_lines = fp.readlines()
_pyexe = _lines[0].strip()
_env_path = _lines[1].strip()
def exec_python(pycode):
"""
Wrap running python script in a subprocess.
Return stdout of the invoked command.
"""
# Environment variable 'PATH' has to be defined on Windows, otherwise dynamic library pythonXY.dll cannot be
# found by the Python executable.
env = copy.deepcopy(os.environ)
env['PATH'] = _env_path
out = subprocess.Popen([_pyexe, '-c', pycode], env=env, stdout=subprocess.PIPE, shell=False).stdout.read()
# In Python 3, stdout is a byte array and must be converted to string.
out = out.decode('ascii').strip()
return out
def compare(test_name, expect, frozen):
# Modules in Python 3 contain attr '__cached__' - add it to the frozen list.
if '__cached__' not in frozen:
frozen.append('__cached__')
frozen.sort()
frozen = str(frozen)
print(test_name)
print(' Attributes expected: ' + expect)
print(' Attributes current: ' + frozen)
print('')
# Compare attributes of frozen module with unfronzen module.
if not frozen == expect:
raise SystemExit('Frozen module has no same attributes as unfrozen.')
# General Python code for subprocess.
subproc_code = """
import {0} as myobject
lst = dir(myobject)
# Sort attributes.
lst.sort()
print(lst)
"""
# Pure Python module.
_expect = exec_python(subproc_code.format('xml.etree.ElementTree'))
_frozen = dir(ET)
compare('ElementTree', _expect, _frozen)
# C-extension Python module.
_expect = exec_python(subproc_code.format('xml.etree.cElementTree'))
_frozen = dir(cET)
compare('cElementTree', _expect, _frozen)
|