pyarmor 8.5.4__zip → 8.5.5__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.
Files changed (122) hide show
  1. {pyarmor-8.5.4 → pyarmor-8.5.5}/PKG-INFO +1 -1
  2. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/__init__.py +1 -1
  3. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/__main__.py +7 -6
  4. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/context.py +12 -4
  5. pyarmor-8.5.5/pyarmor/cli/core.data.1 +0 -0
  6. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/default.cfg +28 -1
  7. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/repack.py +28 -5
  8. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/config.py +1 -1
  9. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor.egg-info/PKG-INFO +1 -1
  10. pyarmor-8.5.4/pyarmor/cli/core.data.1 +0 -0
  11. {pyarmor-8.5.4 → pyarmor-8.5.5}/MANIFEST.in +0 -0
  12. {pyarmor-8.5.4 → pyarmor-8.5.5}/README.md +0 -0
  13. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/README.rst +0 -0
  14. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/__init__.py +0 -0
  15. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/benchmark.py +0 -0
  16. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/build_meta.py +0 -0
  17. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/bootstrap.py +0 -0
  18. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/bug.py +0 -0
  19. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/config.py +0 -0
  20. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/core.data.2 +0 -0
  21. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/core.data.3 +0 -0
  22. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/docker.py +0 -0
  23. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/generate.py +0 -0
  24. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/hdinfo.py +0 -0
  25. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/merge.py +0 -0
  26. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/mixer.py +0 -0
  27. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/plugin.py +0 -0
  28. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/public_capsule.zip +0 -0
  29. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/register.py +0 -0
  30. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/resource.py +0 -0
  31. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cli/shell.py +0 -0
  32. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/cobuilder.py +0 -0
  33. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/README-ZH.md +0 -0
  34. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/README.md +0 -0
  35. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/build-for-exe.bat +0 -0
  36. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/build-for-freeze.bat +0 -0
  37. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/build-with-project.bat +0 -0
  38. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/build-with-project.sh +0 -0
  39. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/cx_Freeze/hello.py +0 -0
  40. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/cx_Freeze/queens.py +0 -0
  41. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/cx_Freeze/setup.py +0 -0
  42. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/helloworld/foo.py +0 -0
  43. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/obfuscate-app.bat +0 -0
  44. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/obfuscate-app.sh +0 -0
  45. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/obfuscate-pkg.bat +0 -0
  46. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/obfuscate-pkg.sh +0 -0
  47. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pack-obfuscated-scripts.bat +0 -0
  48. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pack-obfuscated-scripts.sh +0 -0
  49. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/py2exe/hello.py +0 -0
  50. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/py2exe/queens.py +0 -0
  51. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/py2exe/setup.py +0 -0
  52. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/Arithmetic.py +0 -0
  53. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/Calls.py +0 -0
  54. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/CommandLine.py +0 -0
  55. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/Constructs.py +0 -0
  56. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/Dict.py +0 -0
  57. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/Exceptions.py +0 -0
  58. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/Imports.py +0 -0
  59. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/Instances.py +0 -0
  60. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/Lists.py +0 -0
  61. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/Lookups.py +0 -0
  62. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/NewInstances.py +0 -0
  63. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/Numbers.py +0 -0
  64. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/Setup.py +0 -0
  65. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/Strings.py +0 -0
  66. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/Tuples.py +0 -0
  67. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/With.py +0 -0
  68. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/clockres.py +0 -0
  69. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/package/__init__.py +0 -0
  70. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/package/submodule.py +0 -0
  71. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/pybench.py +0 -0
  72. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/pybench/systimes.py +0 -0
  73. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/simple/queens.py +0 -0
  74. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/testmod/hello.py +0 -0
  75. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/testmod/queens.py +0 -0
  76. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/testpkg/main.py +0 -0
  77. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/testpkg/mypkg/__init__.py +0 -0
  78. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/examples/testpkg/mypkg/foo.py +0 -0
  79. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/helper/__init__.py +0 -0
  80. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/helper/build_data_module.py +0 -0
  81. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/helper/buildext.py +0 -0
  82. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/helper/get_bind_key.py +0 -0
  83. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/helper/get_license_info.py +0 -0
  84. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/helper/get_platform_name.py +0 -0
  85. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/helper/merge.py +0 -0
  86. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/helper/repack.py +0 -0
  87. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/helper/superuntime.py +0 -0
  88. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/license.tri +0 -0
  89. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/packer.py +0 -0
  90. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/platforms/darwin/x86_64/_pytransform.dylib +0 -0
  91. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/platforms/linux/x86/_pytransform.so +0 -0
  92. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/platforms/linux/x86_64/_pytransform.so +0 -0
  93. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/platforms/windows/x86/_pytransform.dll +0 -0
  94. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/platforms/windows/x86_64/_pytransform.dll +0 -0
  95. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/plugins/README.md +0 -0
  96. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/plugins/check_ntp_time.py +0 -0
  97. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/polyfills/__init__.py +0 -0
  98. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/polyfills/argparse.py +0 -0
  99. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/product.key +0 -0
  100. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/project.py +0 -0
  101. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/protect_code.pt +0 -0
  102. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/protect_code2.pt +0 -0
  103. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/public.key +0 -0
  104. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/public_capsule.zip +0 -0
  105. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/pyarmor-deprecated.py +0 -0
  106. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/pyarmor-webui.py +0 -0
  107. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/pyarmor.py +0 -0
  108. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/pyimcore.py +0 -0
  109. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/pyshield.key +0 -0
  110. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/pyshield.lic +0 -0
  111. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/pytransform.py +0 -0
  112. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/reform.py +0 -0
  113. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/register.py +0 -0
  114. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/sppmode.py +0 -0
  115. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor/utils.py +0 -0
  116. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor.egg-info/SOURCES.txt +0 -0
  117. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor.egg-info/dependency_links.txt +0 -0
  118. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor.egg-info/entry_points.txt +0 -0
  119. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor.egg-info/requires.txt +0 -0
  120. {pyarmor-8.5.4 → pyarmor-8.5.5}/pyarmor.egg-info/top_level.txt +0 -0
  121. {pyarmor-8.5.4 → pyarmor-8.5.5}/setup.cfg +0 -0
  122. {pyarmor-8.5.4 → pyarmor-8.5.5}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.1
2
2
  Name: pyarmor
3
- Version: 8.5.4
3
+ Version: 8.5.5
4
4
  Summary: A tool used to obfuscate python scripts, bind obfuscated scripts to fixed machine or expire obfuscated scripts.
5
5
  Home-page: https://github.com/dashingsoft/pyarmor
6
6
  Author: Jondy Zhao
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
 
3
- __VERSION__ = '8.5.4'
3
+ __VERSION__ = '8.5.5'
4
4
 
5
5
  logger = logging.getLogger('cli')
6
6
 
@@ -135,7 +135,7 @@ def format_gen_args(ctx, args):
135
135
  options['user_data'] = args.bind_data
136
136
 
137
137
  if args.pack:
138
- dist_path = os.path.join(ctx.repack_path, 'dist')
138
+ dist_path = ctx.pack_obfpath
139
139
  logger.info('implicitly save obfuscated scripts to "%s"', dist_path)
140
140
  options['output'] = dist_path
141
141
 
@@ -209,7 +209,7 @@ 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
- choices = 'auto', 'onefile', 'onedir'
212
+ choices = 'auto', 'onefile', 'onedir', 'F', 'D', 'FC', 'DC'
213
213
  if args.pack not in choices and not os.path.isfile(args.pack):
214
214
  raise CliError('--pack must be an executable file, '
215
215
  '"auto", "onefile" or "onedir"')
@@ -232,15 +232,16 @@ def cmd_gen(ctx, args):
232
232
  return _cmd_gen_key(builder, options)
233
233
  elif args.inputs[0].lower() in ('runtime', 'run', 'r'):
234
234
  _cmd_gen_runtime(builder, options)
235
- elif args.pack in ('auto', 'onefile', 'onedir'):
235
+ elif args.pack in ('auto', 'onefile', 'onedir', 'F', 'D', 'FC', 'DC'):
236
236
  from .repack import Repacker6
237
237
  packer = Repacker6(ctx, args.pack, options['inputs'], args.output)
238
+ packer.check()
238
239
  builder.process(options, packer)
239
240
  Plugin.post_build(ctx, pack=args.pack)
240
241
  elif args.pack:
241
242
  from .repack import Repacker
242
243
  codesign = ctx.cfg['pack'].get('codesign_identify', None)
243
- packer = Repacker(args.pack, ctx.repack_path, codesign=codesign)
244
+ packer = Repacker(args.pack, ctx.pack_basepath, codesign=codesign)
244
245
  packer.check()
245
246
  builder.process(options, packer=packer)
246
247
  Plugin.post_build(ctx, pack=args.pack)
@@ -419,8 +420,8 @@ https://pyarmor.readthedocs.io/en/stable/reference/man.html#pyarmor-gen
419
420
  'action arguments'
420
421
  ).add_mutually_exclusive_group()
421
422
  group.add_argument(
422
- '--pack', metavar='BUNDLE',
423
- help='repack bundle with obfuscated scripts'
423
+ '--pack', metavar='MODE',
424
+ help='specify pack mode, onefile or onedir'
424
425
  )
425
426
  group.add_argument(
426
427
  '--no-runtime', action='store_true', help=argparse.SUPPRESS
@@ -366,10 +366,6 @@ class Context(object):
366
366
  return self._check_logpath(
367
367
  self.cfg['logging'].get('trace_logfile', 'pyarmor.trace.log'))
368
368
 
369
- @property
370
- def repack_path(self):
371
- return os.path.join(self.local_path, 'pack')
372
-
373
369
  def _optb(self, section, name):
374
370
  return self.cfg.getboolean(section, name, vars=self.cmd_options)
375
371
 
@@ -608,6 +604,10 @@ class Context(object):
608
604
  def runtime_obf_key_mode(self):
609
605
  return self._opti('runtime', 'obf_key_mode')
610
606
 
607
+ @property
608
+ def runtime_patch_extension(self):
609
+ return self._opti('runtime', 'patch_extension')
610
+
611
611
  #
612
612
  # RFT settings
613
613
  #
@@ -736,3 +736,11 @@ class Context(object):
736
736
  elif line:
737
737
  pyi_opts.append(line)
738
738
  return pyi_opts
739
+
740
+ @property
741
+ def pack_basepath(self):
742
+ return os.path.join(self.local_path, 'pack')
743
+
744
+ @property
745
+ def pack_obfpath(self):
746
+ return os.path.join(self.pack_basepath, 'dist')
Binary file
@@ -3,7 +3,7 @@
3
3
  ;; Pyarmor version
4
4
  major = 8
5
5
  minor = 5
6
- patch = 4
6
+ patch = 5
7
7
 
8
8
  ;; Compatible core version
9
9
  cli.core = 6.5.1
@@ -223,6 +223,19 @@ package_name_format = pyarmor_runtime_{suffix}
223
223
  ;; pyarmor_runtime.so
224
224
  simple_extension_name = 1
225
225
 
226
+ ;; Whether patching extension to embedded runtime key
227
+ ;;
228
+ ;; 0: do not patch extension, but store runtime key to one file
229
+ ;; 1: runtime key is embedded into extension
230
+ ;;
231
+ ;; The purpose is to solve code sign issue for Darwin platform
232
+ ;; Do not patch extension will keep code sign, so need not re-sign
233
+ ;; But it need an extra file.
234
+ ;;
235
+ ;; Note: it's different from outer runtime key.
236
+ ;;
237
+ patch_extension = 1
238
+
226
239
  ;; Obfuscate runtime key
227
240
  ;; 0: no obfuscation
228
241
  ;; 1: simple obfuscation
@@ -342,6 +355,20 @@ strip = 0
342
355
  ;; append, append it to archive
343
356
  no_matched_pyc = error
344
357
 
358
+ ;; Extra options to call PyInstaller when packing the obfuscated scripts
359
+ ;; One option one line, name and value separted by one whitespace
360
+ ;; For example
361
+ ;;
362
+ ;; pyi_options = -w
363
+ ;; --add-data default.cfg:.
364
+ ;; --icon myapp.ico
365
+ ;;
366
+ ;; The following options could not be used here:
367
+ ;;
368
+ ;; --distpath, --workpath, --specpath
369
+ ;;
370
+ ; pyi_options =
371
+
345
372
  [bcc]
346
373
  unsupported_functions = exec eval super locals __assert_armored__
347
374
  unsupported_nodes = AsyncFunctionDef AsyncFor AsyncWith Await Yield YieldFrom GeneratorExp NamedExpr MatchValue MatchSingleton MatchSequence MatchMapping MatchClass MatchStar MatchAs MatchOr
@@ -498,11 +498,12 @@ class Repacker6:
498
498
  self.output = 'dist' if output is None else os.path.normpath(output)
499
499
 
500
500
  self.script = self.inputs[0]
501
- self.packpath = os.path.normpath(self.ctx.repack_path)
501
+ self.obfpath = os.path.normpath(self.ctx.pack_obfpath)
502
+ self.packpath = os.path.normpath(self.ctx.pack_basepath)
502
503
  self.workpath = os.path.join(self.packpath, 'build')
503
- self.obfpath = os.path.join(self.packpath, 'dist')
504
504
  self.pyicmd = [sys.executable, '-m', 'PyInstaller']
505
505
  self.pyiopts = self.init_opts(mode)
506
+ self.autoclean = mode in ('FC', 'DC')
506
507
 
507
508
  def init_opts(self, mode):
508
509
  opts = []
@@ -510,7 +511,7 @@ class Repacker6:
510
511
  if mode == 'auto':
511
512
  exopts += ('--onefile', '-F', '--onefolder', '-D')
512
513
  else:
513
- opts.append('-F' if mode == 'onefile' else '-D')
514
+ opts.append('-F' if mode in ('onefile', 'F', 'FC') else '-D')
514
515
  opts.extend(self.ctx.pyi_options)
515
516
 
516
517
  exvalues = '--distpath', '--specpath', '--workpath'
@@ -540,7 +541,9 @@ class Repacker6:
540
541
  ]
541
542
  cmdspec.extend(self.filter_opts(self.pyiopts, ('--name', '-N')))
542
543
  cmdspec.append(self.script)
543
- check_call(cmdspec)
544
+ logger.debug('%s', ' '.join(cmdspec))
545
+ logger.info('call PyInstaller to generate specfile')
546
+ check_call(cmdspec, stdout=DEVNULL, stderr=DEVNULL)
544
547
 
545
548
  name = os.path.splitext(os.path.basename(self.script))[0]
546
549
  rtname = self.ctx.runtime_package_name
@@ -552,7 +555,10 @@ class Repacker6:
552
555
  cmdlist = self.pyicmd + ['--clean', '--workpath', self.workpath]
553
556
  cmdlist.extend(self.pyiopts)
554
557
  cmdlist.append(specfile)
555
- check_call(cmdlist)
558
+ logger.debug('%s', ' '.join(cmdlist))
559
+ logger.info('call PyInstaller to analysis, '
560
+ 'it may take several minutes ...')
561
+ check_call(cmdlist, stdout=DEVNULL, stderr=DEVNULL)
556
562
 
557
563
  with open(resfile, 'rb') as f:
558
564
  return marshal.load(f)
@@ -569,7 +575,13 @@ class Repacker6:
569
575
  ]
570
576
  cmdlist.extend(self.pyiopts)
571
577
  cmdlist.append(script)
578
+
579
+ logger.debug('%s', ' '.join(cmdlist))
580
+ logger.info('call PyInstaller to generate final bundle ...\n')
572
581
  check_call(cmdlist)
582
+ logger.info('')
583
+ logger.info('the final bundle "%s" has been generate successfully',
584
+ self.output)
573
585
 
574
586
  def repack(self, *unused):
575
587
  """Only for compatible with Repacker"""
@@ -591,3 +603,14 @@ class Repacker6:
591
603
 
592
604
  with open(specfile, 'w') as f:
593
605
  f.write(''.join(lines))
606
+
607
+ def check(self):
608
+ if os.path.exists(self.output) and self.autoclean:
609
+ n = len(os.path.abspath(self.output).split(os.sep))
610
+ if n < 3:
611
+ prompt = 'Are you sure to remove path "%s" (y/n)? '
612
+ choice = input(prompt % self.output).lower()[:1]
613
+ if not choice == 'y':
614
+ return
615
+ logger.info('clean output path "%s"', self.output)
616
+ shutil.rmtree(self.output)
@@ -1,6 +1,6 @@
1
1
  from sys import platform
2
2
 
3
- version = '8.5.4'
3
+ version = '8.5.5'
4
4
 
5
5
  # The corresponding version of pytransform.so
6
6
  core_version = 'r52.6'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.1
2
2
  Name: pyarmor
3
- Version: 8.5.4
3
+ Version: 8.5.5
4
4
  Summary: A tool used to obfuscate python scripts, bind obfuscated scripts to fixed machine or expire obfuscated scripts.
5
5
  Home-page: https://github.com/dashingsoft/pyarmor
6
6
  Author: Jondy Zhao
Binary file
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