pyarmor 8.5.3__zip → 8.5.4__zip
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyarmor-8.5.3 → pyarmor-8.5.4}/PKG-INFO +1 -1
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/__init__.py +1 -1
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/__main__.py +10 -3
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/context.py +19 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/default.cfg +1 -1
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/generate.py +14 -2
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/repack.py +156 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/config.py +1 -1
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor.egg-info/PKG-INFO +1 -1
- {pyarmor-8.5.3 → pyarmor-8.5.4}/MANIFEST.in +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/README.md +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/README.rst +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/__init__.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/benchmark.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/build_meta.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/bootstrap.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/bug.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/config.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/core.data.1 +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/core.data.2 +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/core.data.3 +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/docker.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/hdinfo.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/merge.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/mixer.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/plugin.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/public_capsule.zip +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/register.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/resource.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cli/shell.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/cobuilder.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/README-ZH.md +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/README.md +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/build-for-exe.bat +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/build-for-freeze.bat +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/build-with-project.bat +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/build-with-project.sh +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/cx_Freeze/hello.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/cx_Freeze/queens.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/cx_Freeze/setup.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/helloworld/foo.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/obfuscate-app.bat +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/obfuscate-app.sh +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/obfuscate-pkg.bat +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/obfuscate-pkg.sh +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pack-obfuscated-scripts.bat +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pack-obfuscated-scripts.sh +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/py2exe/hello.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/py2exe/queens.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/py2exe/setup.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/Arithmetic.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/Calls.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/CommandLine.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/Constructs.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/Dict.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/Exceptions.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/Imports.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/Instances.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/Lists.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/Lookups.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/NewInstances.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/Numbers.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/Setup.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/Strings.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/Tuples.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/With.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/clockres.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/package/__init__.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/package/submodule.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/pybench.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/pybench/systimes.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/simple/queens.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/testmod/hello.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/testmod/queens.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/testpkg/main.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/testpkg/mypkg/__init__.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/examples/testpkg/mypkg/foo.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/helper/__init__.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/helper/build_data_module.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/helper/buildext.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/helper/get_bind_key.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/helper/get_license_info.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/helper/get_platform_name.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/helper/merge.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/helper/repack.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/helper/superuntime.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/license.tri +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/packer.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/platforms/darwin/x86_64/_pytransform.dylib +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/platforms/linux/x86/_pytransform.so +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/platforms/linux/x86_64/_pytransform.so +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/platforms/windows/x86/_pytransform.dll +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/platforms/windows/x86_64/_pytransform.dll +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/plugins/README.md +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/plugins/check_ntp_time.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/polyfills/__init__.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/polyfills/argparse.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/product.key +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/project.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/protect_code.pt +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/protect_code2.pt +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/public.key +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/public_capsule.zip +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/pyarmor-deprecated.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/pyarmor-webui.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/pyarmor.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/pyimcore.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/pyshield.key +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/pyshield.lic +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/pytransform.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/reform.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/register.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/sppmode.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor/utils.py +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor.egg-info/SOURCES.txt +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor.egg-info/dependency_links.txt +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor.egg-info/entry_points.txt +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor.egg-info/requires.txt +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/pyarmor.egg-info/top_level.txt +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/setup.cfg +0 -0
- {pyarmor-8.5.3 → pyarmor-8.5.4}/setup.py +0 -0
|
@@ -136,7 +136,7 @@ def format_gen_args(ctx, args):
|
|
|
136
136
|
|
|
137
137
|
if args.pack:
|
|
138
138
|
dist_path = os.path.join(ctx.repack_path, 'dist')
|
|
139
|
-
logger.info('implicitly
|
|
139
|
+
logger.info('implicitly save obfuscated scripts to "%s"', dist_path)
|
|
140
140
|
options['output'] = dist_path
|
|
141
141
|
|
|
142
142
|
return options
|
|
@@ -209,8 +209,10 @@ def check_gen_context(ctx, args):
|
|
|
209
209
|
raise CliError('--outer conflicts with any -e, --period, -b')
|
|
210
210
|
|
|
211
211
|
if args.pack:
|
|
212
|
-
|
|
213
|
-
|
|
212
|
+
choices = 'auto', 'onefile', 'onedir'
|
|
213
|
+
if args.pack not in choices and not os.path.isfile(args.pack):
|
|
214
|
+
raise CliError('--pack must be an executable file, '
|
|
215
|
+
'"auto", "onefile" or "onedir"')
|
|
214
216
|
if args.no_runtime:
|
|
215
217
|
raise CliError('--pack conficts with --no-runtime, --use-runtime')
|
|
216
218
|
if ctx.import_prefix:
|
|
@@ -230,6 +232,11 @@ def cmd_gen(ctx, args):
|
|
|
230
232
|
return _cmd_gen_key(builder, options)
|
|
231
233
|
elif args.inputs[0].lower() in ('runtime', 'run', 'r'):
|
|
232
234
|
_cmd_gen_runtime(builder, options)
|
|
235
|
+
elif args.pack in ('auto', 'onefile', 'onedir'):
|
|
236
|
+
from .repack import Repacker6
|
|
237
|
+
packer = Repacker6(ctx, args.pack, options['inputs'], args.output)
|
|
238
|
+
builder.process(options, packer)
|
|
239
|
+
Plugin.post_build(ctx, pack=args.pack)
|
|
233
240
|
elif args.pack:
|
|
234
241
|
from .repack import Repacker
|
|
235
242
|
codesign = ctx.cfg['pack'].get('codesign_identify', None)
|
|
@@ -717,3 +717,22 @@ class Context(object):
|
|
|
717
717
|
|
|
718
718
|
with get_response('pyarmor.dashingsoft.com') as res:
|
|
719
719
|
return res.read()
|
|
720
|
+
|
|
721
|
+
#
|
|
722
|
+
# Pack options for auto/onefile/onefolder mode
|
|
723
|
+
#
|
|
724
|
+
@property
|
|
725
|
+
def pyi_options(self):
|
|
726
|
+
from json import loads as json_loads
|
|
727
|
+
from shlex import split as split_opt
|
|
728
|
+
pyi_opts = []
|
|
729
|
+
jsmarker = 'json::'
|
|
730
|
+
for line in self.cfg['pack'].get('pyi_options', '').splitlines():
|
|
731
|
+
line = line.strip()
|
|
732
|
+
if line.startswith(jsmarker):
|
|
733
|
+
pyi_opts.extend(json_loads(line[len(jsmarker):]))
|
|
734
|
+
elif line.startswith('-'):
|
|
735
|
+
pyi_opts.extend(split_opt(line))
|
|
736
|
+
elif line:
|
|
737
|
+
pyi_opts.append(line)
|
|
738
|
+
return pyi_opts
|
|
@@ -62,6 +62,13 @@ class Finder(object):
|
|
|
62
62
|
self.ctx.obfuscated_modules.add(res.pkgname)
|
|
63
63
|
self.ctx.extra_resources.append(res)
|
|
64
64
|
|
|
65
|
+
def append(self, resources):
|
|
66
|
+
resnames = [x.pkgname for x in self.ctx.resources]
|
|
67
|
+
for res in self._build_resource(resources):
|
|
68
|
+
if res.pkgname not in resnames:
|
|
69
|
+
self.ctx.obfuscated_modules.add(res.pkgname)
|
|
70
|
+
self.ctx.extra_resources.append(res)
|
|
71
|
+
|
|
65
72
|
def process(self):
|
|
66
73
|
logger.info('search inputs ...')
|
|
67
74
|
self.prepare(self.ctx.input_paths)
|
|
@@ -149,8 +156,13 @@ class Builder(object):
|
|
|
149
156
|
finder = Finder(self.ctx)
|
|
150
157
|
finder.process()
|
|
151
158
|
|
|
152
|
-
if packer
|
|
153
|
-
|
|
159
|
+
if packer:
|
|
160
|
+
if options.get('self_contained'):
|
|
161
|
+
finder.process_extra(packer.contents)
|
|
162
|
+
if hasattr(packer, 'analysis'):
|
|
163
|
+
auto_resources = packer.analysis()
|
|
164
|
+
logger.info('find extra resources: %s', auto_resources)
|
|
165
|
+
finder.append(auto_resources)
|
|
154
166
|
|
|
155
167
|
Pytransform3.pre_build(self.ctx)
|
|
156
168
|
|
|
@@ -3,6 +3,7 @@ import marshal
|
|
|
3
3
|
import os
|
|
4
4
|
import shutil
|
|
5
5
|
import struct
|
|
6
|
+
import sys
|
|
6
7
|
import tempfile
|
|
7
8
|
|
|
8
9
|
from importlib._bootstrap_external import _code_to_timestamp_pyc
|
|
@@ -435,3 +436,158 @@ class Repacker:
|
|
|
435
436
|
check_call(cmdlist, stdout=DEVNULL, stderr=DEVNULL)
|
|
436
437
|
except Exception as e:
|
|
437
438
|
logger.warning('%s', e)
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
# This patch is used to modify the specfile generate by PyInstaller
|
|
442
|
+
#
|
|
443
|
+
# It has 2 goals:
|
|
444
|
+
#
|
|
445
|
+
# 1. Find all the imported modules and packages
|
|
446
|
+
#
|
|
447
|
+
# Save them to hook script
|
|
448
|
+
#
|
|
449
|
+
# 2. Search scripts and packages in the path of entry script
|
|
450
|
+
#
|
|
451
|
+
# All of them will be obfuscated automatically
|
|
452
|
+
#
|
|
453
|
+
spec_patch_code = '''
|
|
454
|
+
from PyInstaller.compat import base_prefix
|
|
455
|
+
import marshal
|
|
456
|
+
import os
|
|
457
|
+
|
|
458
|
+
hiddenimports = set([])
|
|
459
|
+
plist = set([])
|
|
460
|
+
mlist = []
|
|
461
|
+
src = {src}
|
|
462
|
+
sn = len(src) + 1
|
|
463
|
+
prefix = os.path.relpath(src)
|
|
464
|
+
prefix = '' if prefix == '.' else prefix
|
|
465
|
+
|
|
466
|
+
for name, path, kind in a.pure:
|
|
467
|
+
if name.startswith('pyi_rth'):
|
|
468
|
+
continue
|
|
469
|
+
if path.startswith(src) and not path.startswith(base_prefix):
|
|
470
|
+
hiddenimports.add(name)
|
|
471
|
+
if name.find('.') == -1 and os.path.basename(path) != '__init__.py':
|
|
472
|
+
mlist.append(os.path.join(prefix, path[sn:]))
|
|
473
|
+
else:
|
|
474
|
+
pkgname = os.path.dirname(path[sn:]).split(os.sep)[0]
|
|
475
|
+
plist.add(os.path.join(prefix, pkgname))
|
|
476
|
+
else:
|
|
477
|
+
hiddenimports.add(name.split('.')[0])
|
|
478
|
+
|
|
479
|
+
with open({resfile}, 'wb') as f:
|
|
480
|
+
marshal.dump(mlist + list(plist), f)
|
|
481
|
+
with open({hookscript}, 'w') as f:
|
|
482
|
+
f.write("hiddenimports=[%s]" % ", ".join([repr(x) for x in hiddenimports]))
|
|
483
|
+
'''
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
class Repacker6:
|
|
487
|
+
"""New repacker to support PyInstaller 6.0+
|
|
488
|
+
|
|
489
|
+
Args:
|
|
490
|
+
ctx: build context
|
|
491
|
+
mode: onefile or onefolder
|
|
492
|
+
inputs: main script to pack
|
|
493
|
+
"""
|
|
494
|
+
|
|
495
|
+
def __init__(self, ctx, mode, inputs, output):
|
|
496
|
+
self.ctx = ctx
|
|
497
|
+
self.inputs = inputs
|
|
498
|
+
self.output = 'dist' if output is None else os.path.normpath(output)
|
|
499
|
+
|
|
500
|
+
self.script = self.inputs[0]
|
|
501
|
+
self.packpath = os.path.normpath(self.ctx.repack_path)
|
|
502
|
+
self.workpath = os.path.join(self.packpath, 'build')
|
|
503
|
+
self.obfpath = os.path.join(self.packpath, 'dist')
|
|
504
|
+
self.pyicmd = [sys.executable, '-m', 'PyInstaller']
|
|
505
|
+
self.pyiopts = self.init_opts(mode)
|
|
506
|
+
|
|
507
|
+
def init_opts(self, mode):
|
|
508
|
+
opts = []
|
|
509
|
+
exopts = '--noconfirm', '-y'
|
|
510
|
+
if mode == 'auto':
|
|
511
|
+
exopts += ('--onefile', '-F', '--onefolder', '-D')
|
|
512
|
+
else:
|
|
513
|
+
opts.append('-F' if mode == 'onefile' else '-D')
|
|
514
|
+
opts.extend(self.ctx.pyi_options)
|
|
515
|
+
|
|
516
|
+
exvalues = '--distpath', '--specpath', '--workpath'
|
|
517
|
+
return self.filter_opts(opts, exvalues, exopts)
|
|
518
|
+
|
|
519
|
+
def filter_opts(self, opts, exvalues, exopts=None):
|
|
520
|
+
result = []
|
|
521
|
+
isvalue = False
|
|
522
|
+
for x in opts:
|
|
523
|
+
if isvalue:
|
|
524
|
+
isvalue = False
|
|
525
|
+
elif x in exvalues:
|
|
526
|
+
isvalue = True
|
|
527
|
+
elif exopts is None or x not in exopts:
|
|
528
|
+
result.append(x)
|
|
529
|
+
return result
|
|
530
|
+
|
|
531
|
+
def analysis(self):
|
|
532
|
+
"""Got imported modules and packages by PyInstaller
|
|
533
|
+
|
|
534
|
+
Generate hook script
|
|
535
|
+
Return file/dir list need to be obfuscated
|
|
536
|
+
"""
|
|
537
|
+
cmdspec = [
|
|
538
|
+
sys.executable, '-m', 'PyInstaller.utils.cliutils.makespec',
|
|
539
|
+
'--specpath', self.packpath
|
|
540
|
+
]
|
|
541
|
+
cmdspec.extend(self.filter_opts(self.pyiopts, ('--name', '-N')))
|
|
542
|
+
cmdspec.append(self.script)
|
|
543
|
+
check_call(cmdspec)
|
|
544
|
+
|
|
545
|
+
name = os.path.splitext(os.path.basename(self.script))[0]
|
|
546
|
+
rtname = self.ctx.runtime_package_name
|
|
547
|
+
specfile = os.path.join(self.packpath, name + '.spec')
|
|
548
|
+
resfile = os.path.join(self.packpath, 'resources.list')
|
|
549
|
+
hookscript = os.path.join(self.packpath, 'hook-%s.py' % rtname)
|
|
550
|
+
self.patch_specfile(specfile, hookscript, resfile)
|
|
551
|
+
|
|
552
|
+
cmdlist = self.pyicmd + ['--clean', '--workpath', self.workpath]
|
|
553
|
+
cmdlist.extend(self.pyiopts)
|
|
554
|
+
cmdlist.append(specfile)
|
|
555
|
+
check_call(cmdlist)
|
|
556
|
+
|
|
557
|
+
with open(resfile, 'rb') as f:
|
|
558
|
+
return marshal.load(f)
|
|
559
|
+
|
|
560
|
+
def build(self):
|
|
561
|
+
"""Generate final bundle to output"""
|
|
562
|
+
script = os.path.join(self.obfpath, os.path.basename(self.inputs[0]))
|
|
563
|
+
cmdlist = self.pyicmd + [
|
|
564
|
+
'--clean',
|
|
565
|
+
'--distpath', self.output,
|
|
566
|
+
'--workpath', self.workpath,
|
|
567
|
+
'--specpath', self.packpath,
|
|
568
|
+
'--additional-hooks-dir', self.packpath,
|
|
569
|
+
]
|
|
570
|
+
cmdlist.extend(self.pyiopts)
|
|
571
|
+
cmdlist.append(script)
|
|
572
|
+
check_call(cmdlist)
|
|
573
|
+
|
|
574
|
+
def repack(self, *unused):
|
|
575
|
+
"""Only for compatible with Repacker"""
|
|
576
|
+
self.build()
|
|
577
|
+
|
|
578
|
+
def patch_specfile(self, specfile, hookscript, resfile):
|
|
579
|
+
# TODO: non-ascii need specify encoding to open file
|
|
580
|
+
lines = []
|
|
581
|
+
with open(specfile, 'r') as f:
|
|
582
|
+
for line in f:
|
|
583
|
+
if line.startswith('pyz = PYZ'):
|
|
584
|
+
break
|
|
585
|
+
lines.append(line)
|
|
586
|
+
|
|
587
|
+
lines.append(spec_patch_code.format(
|
|
588
|
+
src=repr(os.path.abspath(os.path.dirname(self.script))),
|
|
589
|
+
hookscript=repr(os.path.abspath(hookscript)),
|
|
590
|
+
resfile=repr(os.path.abspath(resfile))))
|
|
591
|
+
|
|
592
|
+
with open(specfile, 'w') as f:
|
|
593
|
+
f.write(''.join(lines))
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|