A tool used to obfuscate python scripts, bind obfuscated scripts to fixed machine or expire obfuscated scripts.

Overview

PyArmor

PyArmor is a command line tool used to obfuscate python scripts, bind obfuscated scripts to fixed machine or expire obfuscated scripts. It protects Python scripts by the following ways:

  • Obfuscate code object to protect constants and literal strings.
  • Obfuscate co_code of each function (code object) in runtime.
  • Clear f_locals of frame as soon as code object completed execution.
  • Verify the license file of obfuscated scripts while running it.

Also refer to The Security of PyArmor

Support Platforms

  • Python 2.5, 2.6, 2.7 and Python3
  • Prebuilt Platform: win32, win_amd64, linux_i386, linux_x86_64, macosx_x86_64
  • Embedded Platform: Raspberry Pi, Banana Pi, Orange Pi, TS-4600 / TS-7600

Refer to Standard Platform Names

Quick Start

Installation

pip install pyarmor

Obfuscate scripts

pyarmor obfuscate foo.py

Run obfuscated scripts

python dist/foo.py

Pack obfuscated scripts into one bundle

pip install pyinstaller
pyarmor pack foo.py

Obfuscate scripts with an expired license

pyarmor licenses --expired 2018-12-31 r001
pyarmor obfuscate --with-license licenses/r001/license.lic foo.py

There is also a web-ui package pyarmor-webui

pip install pyarmor-webui

Start webui, open web page in browser (snapshots)

pyarmor-webui

More usage, refer to

License & Purchase

PyArmor is published as shareware, free trial version never expires, but there are some limitations:

  • The maximum size of code object is about 32768 bytes in trial version
  • All the trial version uses same public capsule other than private capsule
  • In trial version the module could not be obfuscated by advanced mode if there are more than about 30 functions (code objects) in this module.
  • ...

For details, refer to PyArmor License.

Change Logs

Report issuses

Click here to report an issue, for security issue email to [email protected].

Comments
  • Access to raw code objects

    Access to raw code objects

    I obfuscated the following Python script.

    examples/test/mymod.py:

    from __future__ import division, absolute_import, print_function, unicode_literals
    
    def func2():
        print('func2')
    
    def func3():
        print(err)
    

    Build pyarmor:

    python pyarmor.py init --src=examples/test --entry=mymod.py projects/test
    
    python pyarmor.py config --disable-restrict-mode=1 projects/test
    
    cd projects/test
    ./pyarmor build
    

    In Python shell:

    >>> import mymod, dis
    >>> dis.dis(mymod)
    Disassembly of func2:
      4     >>    0 LOAD_GLOBAL              0 (print)
                  3 LOAD_CONST               1 (u'func2')
                  6 CALL_FUNCTION            1
                  9 POP_TOP             
                 10 LOAD_CONST               0 (None)
                 13 RETURN_VALUE        
                 14 NOP                 
                 15 NOP                 
                 16 NOP                 
                 17 NOP                 
                 18 NOP                 
                 19 NOP                 
                 20 NOP                 
                 21 NOP                 
                 22 NOP                 
                 23 NOP                 
                 24 JUMP_ABSOLUTE            0
    
    Disassembly of func3:
      7     >>    0 LOAD_GLOBAL              0 (print)
                  3 LOAD_GLOBAL              1 (err)
                  6 CALL_FUNCTION            1
                  9 POP_TOP             
                 10 LOAD_CONST               0 (None)
                 13 RETURN_VALUE        
                 14 NOP                 
                 15 NOP                 
                 16 NOP                 
                 17 NOP                 
                 18 NOP                 
                 19 NOP                 
                 20 NOP                 
                 21 NOP                 
                 22 NOP                 
                 23 NOP                 
                 24 JUMP_ABSOLUTE            0
    

    Is it the correct behaviour that you have access to the raw code objects of a module? So, what is the advantage of using pyarmor? Thanks.

    opened by joonis 118
  • Pyarmor是否可以对第三方工具supervisor的py源码程序加密?

    Pyarmor是否可以对第三方工具supervisor的py源码程序加密?

    您好!Pyarmor是否可以对第三方工具supervisor的py源码程序加密?我对supervisor的py源码程序进行加密,suservisorctl.py 执行完后报堆栈溢出错误。以下我的报错信息!

    *** Error in `python': corrupted double-linked list: 0x0000000001ee32f0 *** ======= Backtrace: ========= /lib64/libc.so.6(+0x7f3e4)[0x7f0b7fc0b3e4] /lib64/libc.so.6(+0x8132d)[0x7f0b7fc0d32d] /lib64/libpython2.7.so.1.0(+0x817d8)[0x7f0b809007d8] /lib64/libpython2.7.so.1.0(+0x817bf)[0x7f0b809007bf] /lib64/libpython2.7.so.1.0(+0x59c7b)[0x7f0b808d8c7b] /lib64/libpython2.7.so.1.0(+0x817bf)[0x7f0b809007bf] /lib64/libpython2.7.so.1.0(+0x9e254)[0x7f0b8091d254] /lib64/libpython2.7.so.1.0(+0x817bf)[0x7f0b809007bf] /lib64/libpython2.7.so.1.0(+0x817bf)[0x7f0b809007bf] /lib64/libpython2.7.so.1.0(+0x9e254)[0x7f0b8091d254] /lib64/libpython2.7.so.1.0(+0x808df)[0x7f0b808ff8df] /lib64/libpython2.7.so.1.0(+0x822a0)[0x7f0b809012a0] /lib64/libpython2.7.so.1.0(_PyModule_Clear+0x16c)[0x7f0b80905dac] /lib64/libpython2.7.so.1.0(PyImport_Cleanup+0x27f)[0x7f0b80975d3f] /lib64/libpython2.7.so.1.0(Py_Finalize+0xfe)[0x7f0b809817ee] /lib64/libpython2.7.so.1.0(Py_Main+0x6a5)[0x7f0b80992ba5] /lib64/libc.so.6(__libc_start_main+0xf5)[0x7f0b7fbae555] python[0x40068e] ======= Memory map: ======== 00400000-00401000 r-xp 00000000 08:08 756171 /usr/bin/python2.7 00600000-00601000 r--p 00000000 08:08 756171 /usr/bin/python2.7 00601000-00602000 rw-p 00001000 08:08 756171 /usr/bin/python2.7 01a69000-01fc3000 rw-p 00000000 00:00 0 [heap] 7f0b6c000000-7f0b6c021000 rw-p 00000000 00:00 0 7f0b6c021000-7f0b70000000 ---p 00000000 00:00 0 7f0b72ce8000-7f0b72cfd000 r-xp 00000000 08:08 757853 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 7f0b72cfd000-7f0b72efc000 ---p 00015000 08:08 757853 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 7f0b72efc000-7f0b72efd000 r--p 00014000 08:08 757853 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 7f0b72efd000-7f0b72efe000 rw-p 00015000 08:08 757853 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 7f0b72efe000-7f0b72f0a000 r-xp 00000000 08:08 758866 /usr/lib64/libnss_files-2.17.so 7f0b72f0a000-7f0b73109000 ---p 0000c000 08:08 758866 /usr/lib64/libnss_files-2.17.so 7f0b73109000-7f0b7310a000 r--p 0000b000 08:08 758866 /usr/lib64/libnss_files-2.17.so 7f0b7310a000-7f0b7310b000 rw-p 0000c000 08:08 758866 /usr/lib64/libnss_files-2.17.so 7f0b7310b000-7f0b731d1000 rw-p 00000000 00:00 0 7f0b731d1000-7f0b731d3000 r-xp 00000000 08:08 804984 /usr/lib64/python2.7/lib-dynload/syslog.so 7f0b731d3000-7f0b733d2000 ---p 00002000 08:08 804984 /usr/lib64/python2.7/lib-dynload/syslog.so 7f0b733d2000-7f0b733d3000 r--p 00001000 08:08 804984 /usr/lib64/python2.7/lib-dynload/syslog.so 7f0b733d3000-7f0b733d4000 rw-p 00002000 08:08 804984 /usr/lib64/python2.7/lib-dynload/syslog.so 7f0b733d4000-7f0b733d6000 r-xp 00000000 08:08 804903 /usr/lib64/python2.7/lib-dynload/resource.so 7f0b733d6000-7f0b735d5000 ---p 00002000 08:08 804903 /usr/lib64/python2.7/lib-dynload/resource.so 7f0b735d5000-7f0b735d6000 r--p 00001000 08:08 804903 /usr/lib64/python2.7/lib-dynload/resource.so 7f0b735d6000-7f0b735d7000 rw-p 00002000 08:08 804903 /usr/lib64/python2.7/lib-dynload/resource.so 7f0b735d7000-7f0b735dc000 r-xp 00000000 08:08 804904 /usr/lib64/python2.7/lib-dynload/selectmodule.so 7f0b735dc000-7f0b737db000 ---p 00005000 08:08 804904 /usr/lib64/python2.7/lib-dynload/selectmodule.so 7f0b737db000-7f0b737dc000 r--p 00004000 08:08 804904 /usr/lib64/python2.7/lib-dynload/selectmodule.so 7f0b737dc000-7f0b737de000 rw-p 00005000 08:08 804904 /usr/lib64/python2.7/lib-dynload/selectmodule.so 7f0b737de000-7f0b73b5e000 rw-p 00000000 00:00 0 7f0b73b5e000-7f0b73b62000 r-xp 00000000 08:08 804535 /usr/lib64/python2.7/lib-dynload/_localemodule.so 7f0b73b62000-7f0b73d61000 ---p 00004000 08:08 804535 /usr/lib64/python2.7/lib-dynload/_localemodule.so 7f0b73d61000-7f0b73d62000 r--p 00003000 08:08 804535 /usr/lib64/python2.7/lib-dynload/_localemodule.so 7f0b73d62000-7f0b73d63000 rw-p 00004000 08:08 804535 /usr/lib64/python2.7/lib-dynload/_localemodule.so 7f0b73d63000-7f0b73e23000 rw-p 00000000 00:00 0 7f0b73e23000-7f0b73e25000 r-xp 00000000 08:08 804664 /usr/lib64/python2.7/lib-dynload/grpmodule.so 7f0b73e25000-7f0b74024000 ---p 00002000 08:08 804664 /usr/lib64/python2.7/lib-dynload/grpmodule.so 7f0b74024000-7f0b74025000 r--p 00001000 08:08 804664 /usr/lib64/python2.7/lib-dynload/grpmodule.so 7f0b74025000-7f0b74026000 rw-p 00002000 08:08 804664 /usr/lib64/python2.7/lib-dynload/grpmodule.so 7f0b74026000-7f0b74066000 rw-p 00000000 00:00 0 7f0b74066000-7f0b7408d000 r-xp 00000000 08:08 754673 /usr/lib64/libexpat.so.1.6.0 7f0b7408d000-7f0b7428d000 ---p 00027000 08:08 754673 /usr/lib64/libexpat.so.1.6.0 7f0b7428d000-7f0b7428f000 r--p 00027000 08:08 754673 /usr/lib64/libexpat.so.1.6.0 7f0b7428f000-7f0b74290000 rw-p 00029000 08:08 754673 /usr/lib64/libexpat.so.1.6.0 7f0b74290000-7f0b7429b000 r-xp 00000000 08:08 803410 /usr/lib64/python2.7/lib-dynload/pyexpat.so 7f0b7429b000-7f0b7449a000 ---p 0000b000 08:08 803410 /usr/lib64/python2.7/lib-dynload/pyexpat.so 7f0b7449a000-7f0b7449b000 r--p 0000a000 08:08 803410 /usr/lib64/python2.7/lib-dynload/pyexpat.so 7f0b7449b000-7f0b7449d000 rw-p 0000b000 08:08 803410 /usr/lib64/python2.7/lib-dynload/pyexpat.so 7f0b7449d000-7f0b744ae000 r-xp 00000000 08:08 804584 /usr/lib64/python2.7/lib-dynload/datetime.so 7f0b744ae000-7f0b746ad000 ---p 00011000 08:08 804584 /usr/lib64/python2.7/lib-dynload/datetime.so 7f0b746ad000-7f0b746ae000 r--p 00010000 08:08 804584 /usr/lib64/python2.7/lib-dynload/datetime.so 7f0b746ae000-7f0b746b2000 rw-p 00011000 08:08 804584 /usr/lib64/python2.7/lib-dynload/datetime.so 7f0b746b2000-7f0b746b6000 r-xp 00000000 08:08 805277 /usr/lib64/python2.7/lib-dynload/zlibmodule.so 7f0b746b6000-7f0b748b5000 ---p 00004000 08:08 805277 /usr/lib64/python2.7/lib-dynload/zlibmodule.so 7f0b748b5000-7f0b748b6000 r--p 00003000 08:08 805277 /usr/lib64/python2.7/lib-dynload/zlibmodule.so

    opened by yq1320 62
  • Restrict Mode Examples?

    Restrict Mode Examples?

    Hi @jondy,

    I know your pretty busy resolving the issues that came about with 6.3.0, I was just wondering if i could get some clear proper examples of how to use the restrict modes..

    What im trying to do

    if i have a dir

    __init__.py
    packer.py
    

    I want __init__.py to be import-able with restrict 1, but how do i then also have packer.py restrict 3 so it cant be imported outside of the __init__.py?

    You doc doesn't cover proper examples things like this, it just doesn't make it clear enough , sorry

    opened by VeNoMouS 56
  • Issue with the pytransform and NameError:  '__pyarmor__'

    Issue with the pytransform and NameError: '__pyarmor__'

    Hello,

    Firstly, I should appreciate the work that you have put in here. It's pretty cool. It works great, however, I have some concerns for this package to use in some usual cases.

    1. This package works pretty good, If you want to secure a single python file, which again is not a usual case out in the production or in normal cases.
    2. If I tend to try the obfuscation on the python executables in a folder, one among all the files present in the folder work well, but the others throw NameError: name '__pyarmor__' is not defined, as they miss bootstrap-code. This is concerning.
    3. If I use pyarmor obfuscation on the python libraries as well as the executable, It turns out with the error : exception: _pytransform can not be loaded twice. Usually, It is equally important to secure both the libraries and its executable in python. Libraries are the place where you have most of the important info is present.
    4. So, It is likely impossible to completely secure the complete python package, such as below:
    packagename
     |- src/
        |- packagename/
          |- __init__.py
          |- yourfiles.py
     |- scripts/
        |- non-exported python files
    
    1. Moreover, the files that get generated when you obfuscate the code, _pytransform.so license.lic pytransform.key pytransform.py. These files are pretty much similar in most of the case, irrespective of the file you use to obfuscate, so why not to have them in a library, so that you don't need to have a huge duplication in the case of the packages with the libraries as above.

    Let me know your view on this, Thank you.

    opened by saikishor 51
  • Can't build a working exe when using super mode

    Can't build a working exe when using super mode

    • Happens only when we use super mode to obfuscate the project, when built with advanced 0 the obfuscated and packaged code works without any issue.
    • Packaged with pyinstaller (not pyarmor pack), spec file is changed to include different pytransform generated by super mode Datas = [('pytransform.pyd','.')...]

    Not sure how I can get more info that would be useful to find the issue, any ideas ?

    {
      "version": "2.0",
      "name": "Prod super mode build",
      "title": "Prod super mode build",
      "src": ".",
      "is_package": null,
      "manifest": "global-include *.py",
      "entry": "main.py",
      "output": "dist",
      "runtime_path": null,
      "restrict_mode": 2,
      "obf_code": 2,
      "obf_mod": 1,
      "wrap_mode": 1,
      "advanced_mode": 2,
      "bootstrap_code": 1,
      "cross_protection": 0,
      "plugins": null,
      "platform": "windows.x86_64.11.py37",
      "package_runtime": 1,
      "enable_suffix": 0,
      "license_file": null,
      "build_time": 1595425907.0985913
    }
    

    Debug

    Microsoft Windows [Version 10.0.18362.959]
    (c) 2019 Microsoft Corporation. Alle rechten voorbehouden.
    
    C:\Users\user\Desktop\O Prod super mode build\dist\dist>"C:\Users\user\Desktop\O Prod super mode build\dist\dist\OAIO V1.1.2.exe"
    [21812] PyInstaller Bootloader 3.x
    [21812] LOADER: executable is C:\Users\user\Desktop\O Prod super mode build\dist\dist\OAIO V1.1.2.exe
    [21812] LOADER: homepath is C:\Users\user\Desktop\O Prod super mode build\dist\dist
    [21812] LOADER: _MEIPASS2 is NULL
    [21812] LOADER: archivename is C:\Users\user\Desktop\O Prod super mode build\dist\dist\OAIO V1.1.2.exe
    [21812] LOADER: Extracting binaries
    [21812] LOADER: Executing self as child
    [21812] LOADER: set _MEIPASS2 to C:\Users\user\AppData\Local\Temp\_MEI218122
    [21812] LOADER: Setting up to run child
    [21812] LOADER: Creating child process
    [21812] LOADER: Waiting for child process to finish...
    [26280] PyInstaller Bootloader 3.x
    [26280] LOADER: executable is C:\Users\user\Desktop\O Prod super mode build\dist\dist\OAIO V1.1.2.exe
    [26280] LOADER: homepath is C:\Users\user\Desktop\O Prod super mode build\dist\dist
    [26280] LOADER: _MEIPASS2 is C:\Users\user\AppData\Local\Temp\_MEI218122
    [26280] LOADER: archivename is C:\Users\user\Desktop\O Prod super mode build\dist\dist\OAIO V1.1.2.exe
    [26280] LOADER: SetDllDirectory(C:\Users\user\AppData\Local\Temp\_MEI218122)
    [26280] LOADER: Already in the child - running user's code.
    [26280] LOADER: manifestpath: C:\Users\user\AppData\Local\Temp\_MEI218122\OAIO V1.1.2.exe.manifest
    [26280] LOADER: Error activating the context: ActivateActCtx:
    An attempt to set the default context for activating a process failed because it has already been set.
    
    [26280] LOADER: Python library: C:\Users\user\AppData\Local\Temp\_MEI218122\python37.dll
    [26280] LOADER: Loaded functions from Python library.
    [26280] LOADER: Manipulating environment (sys.path, sys.prefix)
    [26280] LOADER: sys.prefix is C:\Users\user\AppData\Local\Temp\_MEI218122
    [26280] LOADER: Pre-init sys.path is C:\Users\user\AppData\Local\Temp\_MEI218122\base_library.zip;C:\Users\user\AppData\Local\Temp\_MEI218122
    [26280] LOADER: Setting runtime options
    [26280] LOADER: Bootloader option: pyi-windows-manifest-filename OAIO V1.1.2.exe.manifest
    [26280] LOADER: Initializing python
    [26280] LOADER: Overriding Python's sys.path
    [26280] LOADER: Post-init sys.path is C:\Users\user\AppData\Local\Temp\_MEI218122\base_library.zip;C:\Users\user\AppData\Local\Temp\_MEI218122
    [26280] LOADER: Setting sys.argv
    [26280] LOADER: setting sys._MEIPASS
    [26280] LOADER: importing modules from CArchive
    [26280] LOADER: extracted struct
    [26280] LOADER: callfunction returned...
    [26280] LOADER: extracted pyimod01_os_path
    [26280] LOADER: callfunction returned...
    [26280] LOADER: extracted pyimod02_archive
    [26280] LOADER: callfunction returned...
    [26280] LOADER: extracted pyimod03_importers
    [26280] LOADER: callfunction returned...
    [26280] LOADER: Installing PYZ archive with Python modules.
    [26280] LOADER: PYZ archive: PYZ-00.pyz
    [26280] LOADER: Running pyiboot01_bootstrap.py
    [26280] LOADER: Running pyi_rth_multiprocessing.py
    [26280] LOADER: Running pyi_rth__tkinter.py
    [26280] LOADER: Running pyi_rth_pkgres.py
    [26280] LOADER: Running pyi_rth_pyqt5webengine.py
    [26280] LOADER: Running pyi_rth_pyqt5.py
    [26280] LOADER: Running pyi_rth_certifi.py
    [26280] LOADER: Running pyi_rth_win32comgenpy.py
    [26280] LOADER: Running Main.py
    [21812] LOADER: Back to parent (RC: -1073741571)
    [21812] LOADER: Doing cleanup
    [21812] LOADER: Freeing archive status for C:\Users\user\Desktop\O Prod super mode build\dist\dist\OAIO V1.1.2.exe
    
    opened by martyur 45
  •  Pack command, causes unknown behaviour of the app

    Pack command, causes unknown behaviour of the app

    Using the following commands to pack our applciation. pyarmor init --entry "MRT.py,MRTFiles/attack_controller.py,MRTFiles/attack_dict.py,MRTFiles/cleanup.py,MRTFiles/play.py,MRTFiles/player.py,MRTFiles/vcspam.py,MRTFiles/ServerSmasher/serversmasher.py,MRTFiles/ServerSmasher/serversmasherGUI.py,MRTFiles/ServerSmasher/smconfig.py,plugins/Ghost Ping.py,plugins/helper.py,plugins/Additional/ghostpingmenu.py"

    pyarmor pack -e " --clean -F -p MRTFiles -p plugins --noupx --onefile" .

    Note, that in MRT.py, there are calls, that will start a python file located in the MRTFiles folder(subprocess.popen(executeable, "./MRTFiles/attack_controller", ...)

    The main app does start but once I start a feature it will just start the main application again.

    opened by sla-te 45
  • Is there any difference in obfuscation between trial version and license registration?

    Is there any difference in obfuscation between trial version and license registration?

    Hello :)

    I am using pyarmor 6.8.1 version.

    After obfuscation in the TRIAL version, the service starts normally when applied to uwsgi, but if you register a license and proceed with obfuscation, the uwsgi service will not start normally.

    The same is true if you delete the licensed pyarmor directory and re-register the license as described in the guide.

    Is there a part that needs to be set differently from the trial version when registering a license?

    For your information, no additional error message is captured in the log.

    question 
    opened by JangKyumin 39
  • Advanced mode 1 Failing with Pyenv environment on Pyarmor(6.2.1)

    Advanced mode 1 Failing with Pyenv environment on Pyarmor(6.2.1)

    Hi Again,

    Environment

    Python - 3.6.9 OS - Ubuntu 20.04 Pyarmor - 6.2.0

    Project structure

    mypkg ├── bar.py ├── foo.py └── init.py

    Configuration files

    I am using the child project structure to demonstrate a use-case for a large package. Here we are just obfuscating everything else with restrict mode 4 and using restrict mode 1 for __init__.py. As is recommended for a package.

    # Content .pyarmor_config
    { 
      "version": "2.0",
      "name": "mypkg",
      "title": "mypkg",
      "src": ".",
      "is_package": 1,
      "manifest": "include __init__.py",
      "entry": "__init__.py",
      "output": "dist",
      "runtime_path": null,
      "restrict_mode": 1,
      "obf_code": 2,
      "obf_mod": 1,
      "wrap_mode": 1,
      "advanced_mode": 0,
      "bootstrap_code": 1,
      "cross_protection": 1,
      "plugins": null,
      "platform": null,
      "package_runtime": 1,
      "enable_suffix": 0,
      "license_file": null,
      "build_time": 1589994512.6738808
    }
    
    # Content .pyarmor_config_pkg
    {
      "version": "2.0",
      "name": "mypkg",
      "title": "mypkg",
      "src": ".",
      "is_package": 1,
      "manifest": "global-include *.py, exclude __init__.py",
      "entry": "",
      "output": "dist",
      "runtime_path": null,
      "restrict_mode": 4,
      "obf_code": 2,
      "obf_mod": 1,
      "wrap_mode": 1,
      "advanced_mode": 0,
      "bootstrap_code": 1,
      "cross_protection": 1,
      "plugins": null,
      "platform": null,
      "package_runtime": 1,
      "enable_suffix": 0,
      "license_file": null,
      "build_time": 1589994515.6668053
    }
    

    Command :

    pyarmor build -B
    pyarmor build --no-runtime -B .pyarmor_config_pkg
    

    The build completes successfully.

    Behaviour/Expectation

    If we try to import the obfuscated mykg then we get the following error

    Python 3.6.9 (default, May 20 2020, 20:21:06) 
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import mypkg
    XXX lineno: 8, opcode: 228
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "</media/e0lithic/D/GameX/pyarmor_test/mypkg/dist/mypkg/__init__.py>", line 3, in <module>
      File "<frozen mypkg>", line 8, in <module>
    SystemError: unknown opcode
    

    If we just turn advanced_mode 0 in both configuration files and rerun the build. I am able to import the package.

    I read the documentation but the python 3.6 limitation was only mentioned for advanced_mode 2 / a.k.a super mode. Is the support for advanced mode 1 on python 3.6 also depreciated? Kindly let me know if I am missing something.

    Thanks

    opened by e0lithic 34
  • [Query/Bug] Getting failures in project when using restrict mode 3

    [Query/Bug] Getting failures in project when using restrict mode 3

    HI,

    First of all I would like to thank you for the brilliant work you have done. Kudos!

    Configuration

    INFO     PyArmor Version 5.9.6
    INFO     Project  information
                   version: 2.0
                      name: encrypted_backend
                     title: encrypted_backend
                       src: ../backend
                is_package: None
                  manifest: global-include *.py
                     entry: manage.py
                    output: .
              runtime_path: None
             restrict_mode: 3
                  obf_code: 1
                   obf_mod: 1
                 wrap_mode: 1
             advanced_mode: 1
            bootstrap_code: 1
          cross_protection: 1
                   plugins: None
                  platform: None
           package_runtime: 1
             enable_suffix: 0
              license_file: None
                build_time: Mon Apr 13 14:24:03 2020
    

    Expectation

    • The project has multiple packages and sub packages. However intent is to obfuscate all under one umbrella, hence using a single recursive build.
    • The project being a django backend, has an entry script manage.py, which is only supposed to be executed and not imported anywhere. As such restrict mode 3 seemed to be an ideal fit.

    Error

    • The project obfuscates successfully, however, I get random failures when i try to execute it. Errors like the following - Pytransform Error: This function could not be called from the plain script when running < frozen x.y.z >

    My understanding is that since all the functions are being called from obfuscated files, the error should not pop up. I did some hit and trials in the x.y.z file path and it appears that commenting code like the following makes the error go away (doesn't make sense!).

    if not os.path.exists(root):
            os.makedirs(root)
    if not os.path.exists(dir_path):
            os.makedirs(dir_path)
    

    But then it pops up somewhere in other file. Considering the sheer size of the project and not knowing the underlying code for pyarmor, I am unable to create a directed reproducible example for you unfortunately. Please let me know if I am missing something, or any heads up so that I can provide you with a better reproducible example.

    PS - I am able to successfully run the project with restrict mode 1 and 2.

    Thanks.

    opened by e0lithic 34
  • Target platform string ['linux.x86_64.11.py37'] being read as a list of characters

    Target platform string ['linux.x86_64.11.py37'] being read as a list of characters

    I am using this method https://pyarmor.readthedocs.io/en/latest/advanced.html#distributing-obfuscated-package-with-pip

    My script for obsfucation, run from project/shell directory:

    #!/usr/bin/env bash
    # Prepare the obsfucation, run from shell directory
    rm -rf ../obsfucated
    mkdir -p ../obsfucated
    pyarmor  runtime -O obsfucated --enable-suffix 1 --advanced 2
    pyarmor obfuscate  -r --with-runtime @obsfucated  --exclude package.py,setu*.py,test,test_data,dist,build ../
    

    I am having this issue with the approach

    l$ /bin/bash /home/david/projects/product/shell/obsfucate.sh
    INFO     PyArmor Version 6.5.5
    INFO     Update target platforms to: ['linux.x86_64.11.py37']
    INFO     Generating super runtime library to obsfucated
    INFO     Extract pytransform.key
    INFO     Generate default license file
    INFO     Copying /home/david/.pyarmor/platforms/linux/x86_64/11/py37/pytransform.cpython-37m-x86_64-linux-gnu.so
    INFO     Rename extension to pytransform_vax_000925.cpython-37m-x86_64-linux-gnu.so
    INFO     Patch extension obsfucated/pytransform_vax_000925.cpython-37m-x86_64-linux-gnu.so
    INFO     Patch library file OK
    INFO     Generate runtime files OK
    INFO     Generating protection script ...
    INFO     Generating bootstrap script ...
    INFO     Generating bootstrap script obsfucated/pytransform_bootstrap.py OK
    INFO     PyArmor Version 6.5.5
    INFO     Got settings from --runtime: obsfucated
    INFO         Platforms: linux.x86_64.11.py37
    INFO         Advanced: 2
    INFO         Suffix: _vax_000925
    INFO         License: embedded
    INFO     Target platforms: ['l', 'i', 'n', 'u', 'x', '.', 'x', '8', '6', '_', '6', '4', '.', '1', '1', '.', 'p', 'y', '3', '7']
    ERROR    No available dynamic library for l with features ['11']
    

    Why is it detecting my Target platform and reading it as an array rather than a string?

    opened by davidwynter 33
  • Super-Mode and Threading

    Super-Mode and Threading

    If you thread with 2 or more children under super-mode (advanced 2) it causes python to segfault, I had users complaining so I tested

    • unencrypted - fine
    • advanced mode 1 (default) - fine
    • advanced mode 2 (super-mode) - segfault

    This appears to happen on windows, linux and osx under python 3.7 and 3.8

    right before the segfault you can see it trying to open pytransform...

    30072 stat("/tmp/QQ/dist/helheim/pytransform.cpython-37m-x86_64-linux-gnu.so", {st_dev=makedev(0x8, 0x1), st_ino=4316040, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=1400, st_size=711888, st_atime=1592127252 /* 2020-06-14T21:34:12.009638613+1200 */, st_atime_nsec=9638613, st_mtim
    e=1592123947 /* 2020-06-14T20:39:07+1200 */, st_mtime_nsec=0, st_ctime=1592127203 /* 2020-06-14T21:33:23.342523653+1200 */, st_ctime_nsec=342523653}) = 0
    30072 openat(AT_FDCWD, "/tmp/QQ/dist/helheim/pytransform.cpython-37m-x86_64-linux-gnu.so", O_RDONLY|O_CLOEXEC) = 4
    30072 read(4, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\356\0\0\0\0\0\0@\0\0\0\0\0\0\0\20\326\n\0\0\0\0\0\0\0\0\0@\08\0\7\0@\0\33\0\32\0\1\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\254\204\n\0\0\0\0\0\254\204\n\0\0\0\0\0\0\0 \0\0\0\0\0\1\0\0\0\6\0\0\0(\216\n\0\0\0\0\0(\216*\0\0\0\0\0(\2
    16*\0\0\0\0\0\310F\0\0\0\0\0\0h\216\0\0\0\0\0\0\0\0 \0\0\0\0\0\2\0\0\0\6\0\0\0\350\233\n\0\0\0\0\0\350\233*\0\0\0\0\0\350\233*\0\0\0\0\0\320\1\0\0\0\0\0\0\320\1\0\0\0\0\0\0\10\0\0\0\0\0\0\0\4\0\0\0\4\0\0\0\310\1\0\0\0\0\0\0\310\1\0\0\0\0\0\0\310\1\0\0\0\0\0\0$\0\0\0\0\0\0\0$\0\0\0\0\0\0\0\4\0\0\0\0\0\0\0P\345td\4\0\
    0\0\374\336\t\0\0\0\0\0\374\336\t\0\0\0\0\0\374\336\t\0\0\0\0\0t\25\0\0\0\0\0\0t\25\0\0\0\0\0\0\4\0\0\0\0\0\0\0Q\345td\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0\0\0\0\0\0R\345td\4\0\0\0(\216\n\0\0\0\0\0(\216*\0\0\0\0\0(\216*\0\0\0\0\0\330\21\0\0\0\0\0\0\330\21\0\0
    \0\0\0\0\1\0\0\0\0\0\0\0\4\0\0\0\24\0\0\0\3\0\0\0GNU\0\207w`\266\231Jn\\\342\304\270u\0?/1P\256!w\0\0\0\0\7\1\0\0\7\1\0\0 \0\0\0\v\0\0\0\201\f\0\202\20@\222\260\21\200$\1T!\4\10!\10\250\0@#\200>8\244\211\354\200x\304\25&\0\4J\30D\255\n\f\26\1!\30\0c\0,\4D\201P\30\\\374]\305\4\1H\314S\0\221\260 \24O@\240D \3\2$ !$\24
    2\10QE\201\201\201J\10\211\10\5\2`\302P\343(B\4\22Q\t\24\220A\200\4|\240\272\212%-\6@\225\203\210\250\236\4\1\0\252\210\4\2,\360\246<\252h4\222\244@@\10\r\t\311\310 \1Q\340\234A&\2616\200\0\200A`.\202\200\24\0\220\0\30\6\2\22\30\21\20\0\1\1\2(\20\0\1 \200$\2\263\2055\\\2\20\7\322\36\221D\0\10\2\10\2\200\200\n\0\1\30
    0\0100\242X\1\3h\320\262\310!D\220\204)P\342\304\243E\5\20\20\16\0\200`\235\202\0100\"\31 \301\312\2\2\2\5\0\24 \0\210\210\240\1h@\4\7\1\0\0\10\1\0\0\t\1\0\0\n\1\0\0\20\1\0\0\0\0\0\0\0\0\0\0\21\1\0\0\23\1\0\0\0\0\0\0\25\1\0\0\27\1\0\0\0\0\0\0\32\1\0\0\34\1\0\0\0\0\0\0", 832) = 832
    30072 fstat(4, {st_dev=makedev(0x8, 0x1), st_ino=4316040, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=1400, st_size=711888, st_atime=1592127252 /* 2020-06-14T21:34:12.009638613+1200 */, st_atime_nsec=9638613, st_mtime=1592123947 /* 2020-06-14T20:39:07+1200 */, st_mtime_nsec=0, st
    _ctime=1592127203 /* 2020-06-14T21:33:23.342523653+1200 */, st_ctime_nsec=342523653}) = 0
    30072 mmap(NULL, 2825360, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0x7fa4de808000
    30072 mprotect(0x7fa4de8b1000, 2093056, PROT_NONE) = 0
    30072 mmap(0x7fa4deab0000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 4, 0xa8000) = 0x7fa4deab0000
    30072 mmap(0x7fa4deab6000, 15504, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fa4deab6000
    30072 close(4)                          = 0
    30072 mprotect(0x7fa4deab0000, 8192, PROT_READ) = 0
    30072 prctl(PR_SET_DUMPABLE, SUID_DUMP_DISABLE) = 0
    30072 openat(AT_FDCWD, "/proc/self/status", O_RDONLY) = 4
    30072 fstat(4, {st_dev=makedev(0, 0x4), st_ino=54465736, st_mode=S_IFREG|0444, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=0, st_size=0, st_atime=1592127306 /* 2020-06-14T21:35:06.536646597+1200 */, st_atime_nsec=536646597, st_mtime=1592127306 /* 2020-06-14T21:35:06.536646597+1200 */, st_mtime_nsec=53
    6646597, st_ctime=1592127306 /* 2020-06-14T21:35:06.536646597+1200 */, st_ctime_nsec=536646597}) = 0
    30072 read(4, "Name:\tpython3.7\nUmask:\t0022\nState:\tR (running)\nTgid:\t30072\nNgid:\t0\nPid:\t30072\nPPid:\t30069\nTracerPid:\t30069\nUid:\t0\t0\t0\t0\nGid:\t0\t0\t0\t0\nFDSize:\t64\nGroups:\t0 29 115 \nNStgid:\t30072\nNSpid:\t30072\nNSpgid:\t30069\nNSsid:\t24028\nVmPeak:\t  105600 kB\nVmSize:\t  105600 kB\nVmLc
    k:\t       0 kB\nVmPin:\t       0 kB\nVmHWM:\t   54080 kB\nVmRSS:\t   54080 kB\nRssAnon:\t   35980 kB\nRssFile:\t   18100 kB\nRssShmem:\t       0 kB\nVmData:\t   36708 kB\nVmStk:\t     132 kB\nVmExe:\t    2388 kB\nVmLib:\t   19004 kB\nVmPTE:\t     232 kB\nVmSwap:\t       0 kB\nHugetlbPages:\t       0 kB\nCoreDumpin
    
    opened by VeNoMouS 33
  • [BUG] Socketio spp-mode

    [BUG] Socketio spp-mode

    Problem with socketio repository

    pyarmor obfuscate --src=“.” -r --output dist/test --advanced 5 --mix-str main.py

    *Crash log Log information

    Windows fatal exception: code 0xc000001d
    
    Current thread 0x00000278 (most recent call first):
      File "<frozen main>", line 35 in spp_caller
      File "<sppcode>", line 0 in on_connect
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\socketio\client.py", line 629 in _trigger_event
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\socketio\client.py", line 564 in _handle_connect
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\socketio\client.py", line 701 in _handle_eio_message
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\threading.py", line 888 in run
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\threading.py", line 950 in _bootstrap_inner
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\threading.py", line 908 in _bootstrap
    
    Thread 0x000006d8 (most recent call first):
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\ssl.py", line 1101 in read
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\ssl.py", line 1226 in recv
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\websocket\_socket.py", line 87 in _recv
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\websocket\_socket.py", line 108 in recv
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\websocket\_core.py", line 529 in _recv
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\websocket\_abnf.py", line 373 in recv_strict
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\websocket\_abnf.py", line 294 in recv_header
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\websocket\_abnf.py", line 338 in recv_frame
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\websocket\_core.py", line 445 in recv_frame
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\websocket\_core.py", line 406 in recv_data_frame
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\websocket\_core.py", line 385 in recv_data
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\websocket\_core.py", line 362 in recv
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\engineio\client.py", line 614 in _read_loop_websocket
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\threading.py", line 888 in run
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\threading.py", line 950 in _bootstrap_inner
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\threading.py", line 908 in _bootstrap
    
    Thread 0x000020d8 (most recent call first):
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\threading.py", line 316 in wait
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\queue.py", line 180 in get
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\engineio\client.py", line 662 in _write_loop
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\threading.py", line 888 in run
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\threading.py", line 950 in _bootstrap_inner
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\threading.py", line 908 in _bootstrap
    
    Thread 0x0000195c (most recent call first):
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\threading.py", line 316 in wait
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\threading.py", line 574 in wait
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\socketio\client.py", line 341 in connect
    
    

    If I run this command it works:

    pyarmor obfuscate --src=“.” -r --output dist/obf2 --advanced 4 --mix-str main.py

    I think the problem is in spp-mode . Thanks

    bug 
    opened by reactiver001 0
  • [BUG] [56659] Failed to execute script 'pyi_rth_inspect' due to unhandled exception!

    [BUG] [56659] Failed to execute script 'pyi_rth_inspect' due to unhandled exception!

    1. When I try to run a built application, I get the following erorr... (I am building it inside of a venv) image

    Note I also get the following error when trying to execute pyarmor via python3 -m (When I type just "pyarmor" it uses the one from outside my venv...) image

    documented 
    opened by Gowixx 0
  • [BUG] Bug while packing with --mix-str

    [BUG] Bug while packing with --mix-str

    After packing with the following command

    pyarmor pack --with-license licenses\new\license.lic -x " --mix-str --advanced 1 --plugin check_ntp_time" -e " --onefile --icon icon.ico" Script.py

    After packing successfully. I encounter the following error when running the obfuscated script Note The problem will stay the same even if I waited for the script to be packed using pyinstaller.

    File "Script.py", line 4, in <module>
      File "<frozen Script>", line 202, in <module>
      File "<frozen Script>", line -1, in NTPException
    NameError: name 'utf' is not defined
    

    Note that: If I removed the --mix-str option the code will run with no problems at all after packing.

    I have implemented these lines at the beginning of my code

    # -*- coding: utf-8 -*-
    # {PyArmor Plugins}
    # PyArmor Plugin: check_ntp_time()
    

    Any help?

    bug 
    opened by kr1tx 4
  • [Question] pyarmor : ERROR Check license failed, Invalid input packet.

    [Question] pyarmor : ERROR Check license failed, Invalid input packet.

    Hi ,

    I have purchased pyarmor commercial version I was able to obfuscate above scipt using trial version earlier

    I am trying to install above setup in new gcp ubuntu server I am trying to obfuscate single hello.py file which only prints "hello world"

    below setup:

    python = 3.7.16 pyarmor = 7.7.4

    I have followed following steps

    pyarmor register pyarmor-regfile-XXXX.txt INFO PyArmor Trial Version 7.7.4 INFO Python 3.7.16 INFO Read registration code file: pyarmor-regcode-XXXX.txt INFO Start to activate this code INFO Got keyfile of this code, this code is activated INFO Start to register keyfile: pyarmor-regfile-XXXX.zip INFO Create path: /home/ubuntu/.pyarmor INFO Save registration data to: /home/ubuntu/.pyarmor INFO Extracting license.lic INFO Extracting .pyarmor_capsule.zip INFO This keyfile has been registered successfully. INFO Run "pyarmor register" to check registration information.

    pyarmor register

    _INFO PyArmor Version 7.7.4 INFO Python 3.7.16 PyArmor Version 7.7.4 Registration Code: pyarmor-vax-XXXXXX This code is authorized to

    Note: the registration name and email got from remote server is shown here only, they will not be used anywhere else. But the code "pyarmor-vax-XXXXXX" will be distributed with obfusated scripts.

    Please send request to "[email protected]" from the registration email if you would like to change the typos of registration information._

    pyarmor obfuscate --with-license /home/ubuntu/.pyarmor/license.lic hello.py _INFO PyArmor Version 7.7.4 INFO Python 3.7.16 INFO Target platforms: Native INFO Source path is "/home/ubuntu" INFO Entry scripts are ['hello.py'] INFO Use cached capsule /home/ubuntu/.pyarmor/.pyarmor_capsule.zip INFO Search scripts mode: Normal INFO Save obfuscated scripts to "dist" INFO Read product key from capsule INFO Obfuscate module mode is 2 INFO Obfuscate code mode is 1 INFO Obfuscate string value is False INFO Wrap mode is 1 INFO Restrict mode is 1 INFO Advanced value is 0 INFO Super mode is False INFO Super plus mode is not enabled INFO Generating runtime files to dist/pytransform INFO Extract pytransform.key INFO Generate license file from .pyarmor/license.lic INFO Copying /home/ubuntu/vi_prod/lib/python3.7/site-packages/pyarmor/platforms/linux/x86_64/_pytransform.so INFO Patch library dist/pytransform/pytransform.so INFO Patch library file OK INFO Copying /home/ubuntu/vi_prod/lib/python3.7/site-packages/pyarmor/pytransform.py INFO Rename it to pytransform/init.py INFO Generate runtime files OK INFO Start obfuscating the scripts... INFO hello.py -> dist/hello.py INFO Insert bootstrap code to entry script dist/hello.py INFO Obfuscate 1 scripts OK.

    cd dist/ python3 hello.py Check license failed, Invalid input packet.

    ALSO TRIED following things but didn't work change pyarmor version to 6.8.1 ,7.0.1, 7.6.0 used --platform linux.x86_64 used --advanced 2 removed /home/ubuntu/.pyarmor folder removed orignal hello.py file

    Please help me to solve this issue

    question 
    opened by rahulpp891994 1
  • [BUG] Bug in obfuscating Numpy 1.22.4

    [BUG] Bug in obfuscating Numpy 1.22.4

    After packing with the following command,

    pyarmor pack -e "--hidden-import lxml._elementpath --onefile --clean --upx-dir C:\Users\bram\Projects -y --key XXX --icon myicon.ico" app.py
    

    the following error is thrown when obfuscating Numpy 1.22.4 (it seems):

    INFO            env\Lib\site-packages\numpy\core\tests\test_protocols.py -> dist\obf\env\Lib\site-packages\numpy\core\tests\test_protocols.py
    INFO            env\Lib\site-packages\numpy\core\tests\test_records.py -> dist\obf\env\Lib\site-packages\numpy\core\tests\test_records.py
    INFO            env\Lib\site-packages\numpy\core\tests\test_regression.py -> dist\obf\env\Lib\site-packages\numpy\core\tests\test_regression.py
    ERROR    invalid character '©' (U+00A9) (<frozen env.Lib.site-packages.numpy.core.tests.test_regression>, line 2527)
    ERROR    Run command failed
    

    I'm using the following environment:

    # Name                    Version                   Build  Channel
    altgraph                  0.17.3          py310haa95532_0
    atomicwrites              1.4.0                      py_0
    attrs                     22.1.0          py310haa95532_0
    blas                      1.0                         mkl
    bottleneck                1.3.5           py310h9128911_0
    brotlipy                  0.7.0           py310h2bbff1b_1002
    bzip2                     1.0.8                he774522_0
    ca-certificates           2022.12.7            h5b45459_0    conda-forge
    certifi                   2022.12.7          pyhd8ed1ab_0    conda-forge
    cffi                      1.15.1          py310h2bbff1b_3
    charset-normalizer        2.0.4              pyhd3eb1b0_0
    colorama                  0.4.5           py310haa95532_0
    conda                     22.11.1         py310h5588dad_1    conda-forge
    conda-package-handling    1.9.0           py310h8cc25b3_1
    coverage                  6.3.2           py310h2bbff1b_0
    cryptography              38.0.1          py310h21b164f_0
    future                    0.18.2          py310haa95532_1
    idna                      3.4             py310haa95532_0
    iniconfig                 1.1.1              pyhd3eb1b0_0
    intel-openmp              2021.4.0          haa95532_3556
    libblas                   3.9.0           1_h8933c1f_netlib    conda-forge
    libcblas                  3.9.0           5_hd5c7e75_netlib    conda-forge
    libffi                    3.4.2                hd77b12b_6
    libiconv                  1.16                 h2bbff1b_2
    liblapack                 3.9.0           5_hd5c7e75_netlib    conda-forge
    libxml2                   2.9.14               h0ad7f3c_0
    libxslt                   1.1.35               h2bbff1b_0
    lxml                      4.9.1           py310h1985fb9_0
    m2w64-gcc-libgfortran     5.3.0                         6    conda-forge
    m2w64-gcc-libs            5.3.0                         7    conda-forge
    m2w64-gcc-libs-core       5.3.0                         7    conda-forge
    m2w64-gmp                 6.1.0                         2    conda-forge
    m2w64-libwinpthread-git   5.0.0.4634.697f757               2    conda-forge
    macholib                  1.16.2          py310haa95532_0
    menuinst                  1.4.19          py310h59b6b97_0
    msys2-conda-epoch         20160418                      1    conda-forge
    munch                     2.5.0                      py_0    conda-forge
    nomkl                     1.0                  h5ca1d4c_0    conda-forge
    numexpr                   2.8.3           py310h32c9954_100    conda-forge
    numpy                     1.22.4          py310hed7ac4c_0    conda-forge
    openssl                   1.1.1s               h2bbff1b_0
    packaging                 22.0            py310haa95532_0
    pandas                    1.4.4           py310hd77b12b_0
    pefile                    2022.5.30       py310haa95532_0
    pip                       22.2.2          py310haa95532_0
    pluggy                    1.0.0           py310haa95532_1
    py                        1.11.0             pyhd3eb1b0_0
    pyarmor                   7.7.4                    pypi_0    pypi
    pycosat                   0.6.4           py310h2bbff1b_0
    pycparser                 2.21               pyhd3eb1b0_0
    pycryptodome              3.15.0          py310h2bbff1b_0
    pyinstaller               4.8             py310h8cc25b3_0
    pyopenssl                 22.0.0             pyhd3eb1b0_0
    pysocks                   1.7.1           py310haa95532_0
    pytest                    7.1.2           py310haa95532_0
    pytest-check              1.0.10                   pypi_0    pypi
    pytest-cov                3.0.0              pyhd3eb1b0_0
    python                    3.10.6               hbb2ffb3_0
    python-dateutil           2.8.2              pyhd3eb1b0_0
    python_abi                3.10                    2_cp310    conda-forge
    pytz                      2022.7          py310haa95532_0
    pywin32                   305             py310h2bbff1b_0
    pywin32-ctypes            0.2.0           py310haa95532_1000
    pyyaml                    6.0             py310he2412df_4    conda-forge
    requests                  2.28.1          py310haa95532_0
    ruamel.yaml               0.17.21         py310h2bbff1b_0
    ruamel.yaml.clib          0.2.6           py310h2bbff1b_1
    setuptools                65.5.0          py310haa95532_0
    six                       1.16.0             pyhd3eb1b0_1
    sqlite                    3.40.0               h2bbff1b_0
    tinyaes                   1.0.4                    pypi_0    pypi
    tk                        8.6.12               h2bbff1b_0
    toml                      0.10.2             pyhd3eb1b0_0
    tomli                     2.0.1           py310haa95532_0
    toolz                     0.12.0          py310haa95532_0
    tqdm                      4.64.1          py310haa95532_0
    tzdata                    2022g                h04d1e81_0
    urllib3                   1.26.13         py310haa95532_0
    vc                        14.2                 h21ff451_1
    vs2015_runtime            14.27.29016          h5e58377_2
    wheel                     0.37.1             pyhd3eb1b0_0
    win_inet_pton             1.1.0           py310haa95532_0
    wincertstore              0.2             py310haa95532_2
    xz                        5.2.8                h8cc25b3_0
    yaml                      0.2.5                he774522_0
    my_own_packacge               0.0.1                     dev_0    <develop>
    zlib                      1.2.13               h8cc25b3_0
    

    Any ideas?

    bug 
    opened by bramth 1
  • [BUG] pyarmor register failing: urlopen error [Errno -2] Name or service not known

    [BUG] pyarmor register failing: urlopen error [Errno -2] Name or service not known

    I'm attempting to build a very simple docker image with PyArmor installed for use in a CI/CD job. The docker build is able to install PyArmor with pip, but fails during the pyarmor register step. Per the docs i've tried adding a host for pyarmor.dashingsoft.com:119.23.58.77 using the Docker --add-host command, but it made no difference.

    Dockerfile:

    FROM python:3.9
    
    RUN python3 -m pip install build
    
    ADD pyarmor-regcode-3423.txt .
    RUN python3 -m pip install pyarmor
    RUN pyarmor -d register pyarmor-regcode-3423.txt
    
    ENTRYPOINT [ "pyarmor", "--version"]
    

    Command run: docker build --add-host=pyarmor.dashingsoft.com:119.23.58.77 -t build_image:0.1 .

    Output:

    ...
     => ERROR [5/6] RUN pyarmor -d register pyarmor-regcode-3423.txt                                                                                                                                                                   1.3s
    ------                                                                                                                                                                                                                                  
     > [5/6] RUN pyarmor -d register pyarmor-regcode-3423.txt:
    #8 0.365 INFO     PyArmor Trial Version 7.7.4
    #8 0.365 INFO     Python 3.9.16
    #8 0.365 INFO     Read registration code file: pyarmor-regcode-3423.txt
    #8 0.366 DEBUG    Got registration code: xxxxxxxxxxxxxxxxxxxx
    #8 0.367 INFO     Start to activate this code
    #8 1.213 Traceback (most recent call last):
    #8 1.213   File "/usr/local/lib/python3.9/urllib/request.py", line 1346, in do_open
    #8 1.213     h.request(req.get_method(), req.selector, req.data, headers,
    #8 1.213   File "/usr/local/lib/python3.9/http/client.py", line 1285, in request
    #8 1.214     self._send_request(method, url, body, headers, encode_chunked)
    #8 1.214   File "/usr/local/lib/python3.9/http/client.py", line 1331, in _send_request
    #8 1.215     self.endheaders(body, encode_chunked=encode_chunked)
    #8 1.215   File "/usr/local/lib/python3.9/http/client.py", line 1280, in endheaders
    #8 1.216     self._send_output(message_body, encode_chunked=encode_chunked)
    #8 1.216   File "/usr/local/lib/python3.9/http/client.py", line 1040, in _send_output
    #8 1.216     self.send(msg)
    #8 1.216   File "/usr/local/lib/python3.9/http/client.py", line 980, in send
    #8 1.217     self.connect()
    #8 1.217   File "/usr/local/lib/python3.9/http/client.py", line 1454, in connect
    #8 1.217     self.sock = self._context.wrap_socket(self.sock,
    #8 1.217   File "/usr/local/lib/python3.9/ssl.py", line 501, in wrap_socket
    #8 1.218     return self.sslsocket_class._create(
    #8 1.218   File "/usr/local/lib/python3.9/ssl.py", line 1041, in _create
    #8 1.218     self.do_handshake()
    #8 1.218   File "/usr/local/lib/python3.9/ssl.py", line 1310, in do_handshake
    #8 1.219     self._sslobj.do_handshake()
    #8 1.219 ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)
    #8 1.219 
    #8 1.219 During handling of the above exception, another exception occurred:
    #8 1.219 
    #8 1.219 Traceback (most recent call last):
    #8 1.219   File "/usr/local/lib/python3.9/site-packages/pyarmor/utils.py", line 1685, in _urlopen
    #8 1.220     return urlopen(*args, **kwargs)
    #8 1.220   File "/usr/local/lib/python3.9/urllib/request.py", line 214, in urlopen
    #8 1.220     return opener.open(url, data, timeout)
    #8 1.220   File "/usr/local/lib/python3.9/urllib/request.py", line 517, in open
    #8 1.220     response = self._open(req, data)
    #8 1.220   File "/usr/local/lib/python3.9/urllib/request.py", line 534, in _open
    #8 1.221     result = self._call_chain(self.handle_open, protocol, protocol +
    #8 1.221   File "/usr/local/lib/python3.9/urllib/request.py", line 494, in _call_chain
    #8 1.221     result = func(*args)
    #8 1.222   File "/usr/local/lib/python3.9/urllib/request.py", line 1389, in https_open
    #8 1.222     return self.do_open(http.client.HTTPSConnection, req,
    #8 1.222   File "/usr/local/lib/python3.9/urllib/request.py", line 1349, in do_open
    #8 1.223     raise URLError(err)
    #8 1.223 urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)>
    #8 1.223 
    #8 1.223 During handling of the above exception, another exception occurred:
    #8 1.223 
    #8 1.223 Traceback (most recent call last):
    #8 1.223   File "/usr/local/lib/python3.9/urllib/request.py", line 1346, in do_open
    #8 1.223     h.request(req.get_method(), req.selector, req.data, headers,
    #8 1.223   File "/usr/local/lib/python3.9/http/client.py", line 1285, in request
    #8 1.224     self._send_request(method, url, body, headers, encode_chunked)
    #8 1.224   File "/usr/local/lib/python3.9/http/client.py", line 1331, in _send_request
    #8 1.224     self.endheaders(body, encode_chunked=encode_chunked)
    #8 1.224   File "/usr/local/lib/python3.9/http/client.py", line 1280, in endheaders
    #8 1.225     self._send_output(message_body, encode_chunked=encode_chunked)
    #8 1.225   File "/usr/local/lib/python3.9/http/client.py", line 1040, in _send_output
    #8 1.225     self.send(msg)
    #8 1.225   File "/usr/local/lib/python3.9/http/client.py", line 980, in send
    #8 1.225     self.connect()
    #8 1.225   File "/usr/local/lib/python3.9/http/client.py", line 1447, in connect
    #8 1.226     super().connect()
    #8 1.226   File "/usr/local/lib/python3.9/http/client.py", line 946, in connect
    #8 1.226     self.sock = self._create_connection(
    #8 1.226   File "/usr/local/lib/python3.9/socket.py", line 823, in create_connection
    #8 1.227     for res in getaddrinfo(host, port, 0, SOCK_STREAM):
    #8 1.227   File "/usr/local/lib/python3.9/socket.py", line 954, in getaddrinfo
    #8 1.227     for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
    #8 1.227 socket.gaierror: [Errno -2] Name or service not known
    #8 1.227 
    #8 1.227 During handling of the above exception, another exception occurred:
    #8 1.227 
    #8 1.227 Traceback (most recent call last):
    #8 1.227   File "/usr/local/bin/pyarmor", line 8, in <module>
    #8 1.227     sys.exit(main_entry())
    #8 1.227   File "/usr/local/lib/python3.9/site-packages/pyarmor/pyarmor.py", line 1612, in main_entry
    #8 1.227     main(sys.argv[1:])
    #8 1.227   File "/usr/local/lib/python3.9/site-packages/pyarmor/pyarmor.py", line 1604, in main
    #8 1.228     args.func(args)
    #8 1.228   File "/usr/local/lib/python3.9/site-packages/pyarmor/pyarmor.py", line 866, in _register
    #8 1.228     filename = activate_regcode(ucode)
    #8 1.228   File "/usr/local/lib/python3.9/site-packages/pyarmor/register.py", line 74, in activate_regcode
    #8 1.228     res = _urlopen(reg_url % ucode, timeout=6.0)
    #8 1.228   File "/usr/local/lib/python3.9/site-packages/pyarmor/utils.py", line 1689, in _urlopen
    #8 1.229     return urlopen(*args, **kwargs)
    #8 1.229   File "/usr/local/lib/python3.9/urllib/request.py", line 214, in urlopen
    #8 1.229     return opener.open(url, data, timeout)
    #8 1.229   File "/usr/local/lib/python3.9/urllib/request.py", line 523, in open
    #8 1.229     response = meth(req, response)
    #8 1.229   File "/usr/local/lib/python3.9/urllib/request.py", line 632, in http_response
    #8 1.230     response = self.parent.error(
    #8 1.230   File "/usr/local/lib/python3.9/urllib/request.py", line 555, in error
    #8 1.230     result = self._call_chain(*args)
    #8 1.230   File "/usr/local/lib/python3.9/urllib/request.py", line 494, in _call_chain
    #8 1.230     result = func(*args)
    #8 1.230   File "/usr/local/lib/python3.9/urllib/request.py", line 747, in http_error_302
    #8 1.230     return self.parent.open(new, timeout=req.timeout)
    #8 1.230   File "/usr/local/lib/python3.9/urllib/request.py", line 517, in open
    #8 1.231     response = self._open(req, data)
    #8 1.231   File "/usr/local/lib/python3.9/urllib/request.py", line 534, in _open
    #8 1.231     result = self._call_chain(self.handle_open, protocol, protocol +
    #8 1.231   File "/usr/local/lib/python3.9/urllib/request.py", line 494, in _call_chain
    #8 1.231     result = func(*args)
    #8 1.231   File "/usr/local/lib/python3.9/urllib/request.py", line 1389, in https_open
    #8 1.232     return self.do_open(http.client.HTTPSConnection, req,
    #8 1.232   File "/usr/local/lib/python3.9/urllib/request.py", line 1349, in do_open
    #8 1.233     raise URLError(err)
    #8 1.233 urllib.error.URLError: <urlopen error [Errno -2] Name or service not known>
    ------
    executor failed running [/bin/sh -c pyarmor -d register pyarmor-regcode-3423.txt]: exit code: 1
    
    bug 
    opened by jeffcarlsonfico 1
Releases(v7.7.4)
  • v7.7.4(Dec 11, 2022)

    • Fix bug: pyinstaller option --upx-dir doesn't work in the command pack
    • Fix bug (#884): "insert one redundant line" doesn't work in Python 3.10 for super mode
    Source code(tar.gz)
    Source code(zip)
  • v7.7.3(Nov 20, 2022)

  • v7.7.2(Nov 20, 2022)

  • v7.7.1(Nov 18, 2022)

    • Fix bug(#853): pack command fails when passing the --upx-dir flag to PyInstaller
    • Fix bug(#860): --exact flag doesn't work in the option -x of pack command
    • Fix bug(#878): For pyinstaller 5.6.2, pack command fails with error win32ctypes.pywin32.pywintypes.error: (2, 'LoadLibraryEx', 'The system cannot find the file specified')
    Source code(tar.gz)
    Source code(zip)
  • v7.7.0(Sep 28, 2022)

    • Fix bug(#814): --mix-str results in from __future__ import xxx error
    • Change core version to r52.6
    • Remove duplicated mac addresses when printing all mac addresses
    • Fix super mode crash bug in aarch64 platform
    • Change spp build library version to r4
    • Fix spp mode bug: RuntimeError: Init spp mode failed when function name starts with lambda_
    • Fix spp mode crash bugs
    Source code(tar.gz)
    Source code(zip)
  • v7.6.1(Aug 12, 2022)

  • v7.6.0(Jul 28, 2022)

    • For command obfuscate add option --mix-str to obfuscate the string value
    • For command config add option --mixin, only avaliable mixin is str now
    • Project add new attribute mixins to support option --mixin
    • Change core version to r51.5
    • Change spp build library version to r2
    • Fix spp mode crash bugs because of the same list/dict/set constants conflicts
    • Fix spp mode crash bugs because cellvars and freevars are freed even they are still used by other lambda/functions.
    Source code(tar.gz)
    Source code(zip)
  • v7.5.1(Jun 28, 2022)

    • Fix spp mode bug (#758): from __future__ imports must occur at the beginning of the file
    • Fix spp mode bug (#760): 'Set' object has no attribute 'ctx'
    • Fix spp mode bug (#760): redefinition of _listcomp_326_1
    • Fix spp mode bug: Can not import XXX from MMM
    • Fix spp mode bug: using PYTHONOPTIMIZE may results in sppmode fails.
    • Fix spp mode bugs regarding to with/lambda/comprehension
    Source code(tar.gz)
    Source code(zip)
  • v7.5.0(Jun 6, 2022)

    • Fix command pack issue: if using --src in the option --xoptions, pyarmor raises excpetion no entry script found
    • Change core version and spp library version to r50.4
    • Support sppmode for Python3.7~3.10 in platforms: darwin.aarch64, linux.aarch64
    • Support sppmode for Python 3.10 in platforms: windows.x86_64, linux.x86_64, darwin.x86_64, darwin.aarch64, linux.aarch64
    • Fix sppmode bug: the result of inplace op for attribute is not right. For example, after self.a += 1, self.a isn't increased in old version.
    • Fix sppmode bug: AnnAssign is ignored. For example, after x: int = 3, x still is undefined in old version.
    Source code(tar.gz)
    Source code(zip)
  • v7.4.3(Apr 30, 2022)

  • v7.4.2(Apr 18, 2022)

  • v7.4.1(Mar 12, 2022)

  • v7.4.0(Mar 2, 2022)

    • Change core version to r49.3
    • Fix centos6 issue: GLIBC 2.14 not found
    • Fix python3.10 super mode crash issue (#686)
    • Support new platform musl.aarch64
    • Add new super mode darwin.aarch64 for Python 3.10
    Source code(tar.gz)
    Source code(zip)
  • v7.3.6(Feb 7, 2022)

    • Refine register function.
    • In Darwin support option --platform darwin.aarch64,darwin.x86_64 to create universal runtime binary when obfuscationg the scripts.
    Source code(tar.gz)
    Source code(zip)
  • v7.3.3(Jan 29, 2022)

    • Fix issue: pyarmor register doesn't show register information for Python3
    • In Darwin codesign the runtime binary file to avoid the obfuscated scripts killed by Apple M1
    Source code(tar.gz)
    Source code(zip)
  • v7.3.1(Jan 25, 2022)

    • Fix issue (#663): the merge script raises exception too many runtime files if the runtime files are generated by command runtime
    • Add new option --no-runtime for merge script helper.merge
    • Add new platform linux.x86.11.py310 to support super mode for Python 3.10
    • Do not load core library _pytransform for command register and download
    Source code(tar.gz)
    Source code(zip)
  • v7.3.0(Jan 2, 2022)

    • Change core version to r48.2
    • Fix Apple Silcon crash issue: use darwin.aarch64.0 as default library
    • Add 2 super mode libraries: darwin.aarch64.8.py38, darwin.aarch64.8.py39
    Source code(tar.gz)
    Source code(zip)
  • v7.2.4(Dec 27, 2021)

  • v7.2.3(Dec 15, 2021)

  • v7.2.0(Dec 10, 2021)

  • v7.1.0(Dec 1, 2021)

    • Check the conflicts of option --restrict 0 and --with-license
    • Fix issue (#628): super plus mode crashes if any function is patched
    • Fix link errors in documentation
    • Change core version to r47.1
    • Support Python 3.10. For super mode, now only 3 platforms: windows.x86_64, linux.x86_64, darwin.x86_64
    Source code(tar.gz)
    Source code(zip)
  • v7.0.2(Nov 2, 2021)

  • v7.0.1(Oct 31, 2021)

    A big feature Super Plus Mode is introduced in this version, and the format of license file for obfuscated scripts is changed.

    Because the trial version uses the old core libraries, so it doesn't work with new license. When running the scripts which are obfuscated by trial version with option --platform or --advanced, it will raise exception: Check license failed, Invalid input packet.

    • Fix issue (#584): failed to run pyarmor in Cygwin
    • Fix issue (#586): In linux combining options both --enable-suffix and --advanced 1 doesn't work
    • Increase core version to r46.20
    • Add sppmode, refer to Super Plus Mode
    • Change the format of license file for obfuscated scripts and the old core libraries (before r46.20) doesn't work with new licenses.
    Source code(tar.gz)
    Source code(zip)
  • v6.8.1(Oct 1, 2021)

  • v6.8.0(Sep 1, 2021)

    • Fix issue (#557): Invalid platform name for VM mode
    • Change core version to r45.19
    • In Linux support to get the serial number of mmc/sd card
    • In Linux refine the code of getting default harddisk
    • Supprot to run obfuscated scripts by multiple Python versions, refer to https://pyarmor.readthedocs.io/en/latest/advanced.html#run-obfuscated-scripts-by-different-python-versions
    • Fix Apple Silicon doesn't work issue
    Source code(tar.gz)
    Source code(zip)
  • v6.7.4(Aug 1, 2021)

    • Fix issue (#547): in MacOS the repack script fails if the executable is signed.
    • Add option --code-identity for repack script
    • Fix issue (#549): refine repack script to wait for the termination of objcopy
    • Change core version to r44.18
    • Fix issue: in super mode object.__del__ raises exception NameError: name '__armor_wrap__' is not defined
    • Fix issue (#530): in non-super mode object.__del__ raises exception NameError: name '__armor_enter__' is not defined. Note that for Python 3.7 and later, this issue still exists in non-super mode. Use super mode for these Python versions to solve this issue.
    • Add restrict mode 100+, refer to Restrict Mode
    • Check sys.PYARMOR_LICENSE for outer license, and refine outer license search policy. Refer to :ref:How to use outer license file
    • Fix issue (#539): runtime command generates wrong protection code for super mode
    • Fix issue (#550): memory leak of builtin function locals in super mode
    Source code(tar.gz)
    Source code(zip)
  • v6.7.3(Jul 2, 2021)

  • v6.7.2(Jun 7, 2021)

    • Fix issue (#518): remove platform part from extension name for super mode, now the final name is always pytransform.so or pytransform.pyd
    • Change core version to r43.17
    • Fix issue: the platform "android.aarch64" always raises exception Check license failed, Invalid input packet
    Source code(tar.gz)
    Source code(zip)
  • v6.7.1(May 20, 2021)

    • Support environment variable PYARMOR_TIMEOUT to set the timeout of any network connection.
    • Fix issue (#503): repack complains of too many pytransform
    • Support platform isilon onefs, alias of freebsd
    • Print the version of Python in the console when running pyarmor sub-command
    Source code(tar.gz)
    Source code(zip)
  • v6.7.0(Apr 28, 2021)

    There is a big change in this version is that the trial version could not download the latest extra core libraries. Except the core libraries distributed with soure package, for trial version all the other core libraries will always use the ones same as v6.6.2 (tag: r41.15).

    • Remove platform data file index.json from source package
    • The trial version could not download the latest platform libraries, it always uses core version r41.15
    • Fix super mode for Python39-32 in Windows issue(#489): Dll load failed (The specified procedure could not be found)

    Only fixed in purchased version

    • Improve the security of check_armored for super mode
    • Fix memory leak issue for core dynamic libraries
    Source code(tar.gz)
    Source code(zip)
Owner
Dashingsoft
Focus on how to obfuscate python scripts for more than ten years, Pyarmor has been a powerful tool in the field of protecting and distributing python scripts.
Dashingsoft
py2app is a Python setuptools command which will allow you to make standalone Mac OS X application bundles and plugins from Python scripts.

py2app is a Python setuptools command which will allow you to make standalone Mac OS X application bundles and plugins from Python scripts. py2app is

Ronald Oussoren 222 Dec 30, 2022
Create standalone executables from Python scripts, with the same performance and is cross-platform.

About cx_Freeze cx_Freeze creates standalone executables from Python scripts, with the same performance, is cross-platform and should work on any plat

Marcelo Duarte 1k Jan 4, 2023
A library and tool for generating .pex (Python EXecutable) files

PEX Contents Overview Installation Simple Examples Integrating pex into your workflow Documentation Development Contributing Overview pex is a library

Pants Build 2.2k Jan 1, 2023
A modern Python application packaging and distribution tool

PyOxidizer PyOxidizer is a utility for producing binaries that embed Python. The over-arching goal of PyOxidizer is to make complex packaging and dist

Gregory Szorc 4.5k Jan 7, 2023
tool for creating installers from conda packages

(conda) Constructor Description Constructor is a tool which allows constructing an installer for a collection of conda packages. It solves needed pack

Conda 386 Jan 4, 2023
debinstaller - A tool to install .deb files in any distro.

debinstaller A tool to install .deb files in any distro. Installation for debinstaller

Manoj Paramsetti 6 Nov 6, 2022
Nuitka Organization 8k Jan 7, 2023
Python virtualenvs in Debian packages

dh-virtualenv Contents Overview Presentations, Blogs & Other Resources Using dh-virtualenv How does it work? Running tests Building the package in a D

Spotify 1.5k Dec 16, 2022
Freeze (package) Python programs into stand-alone executables

PyInstaller Overview PyInstaller bundles a Python application and all its dependencies into a single package. The user can run the packaged app withou

PyInstaller 9.9k Jan 8, 2023
shiv is a command line utility for building fully self contained Python zipapps as outlined in PEP 441, but with all their dependencies included.

shiv shiv is a command line utility for building fully self-contained Python zipapps as outlined in PEP 441, but with all their dependencies included!

LinkedIn 1.5k Dec 28, 2022
Core utilities for Python packages

packaging Reusable core utilities for various Python Packaging interoperability specifications. This library provides utilities that implement the int

Python Packaging Authority 451 Jan 4, 2023
A distutils extension to create standalone Windows programs from Python code

py2exe for Python 3 py2exe is a distutils extension which allows to build standalone Windows executable programs (32-bit and 64-bit) from Python scrip

py2exe 526 Jan 4, 2023
Build Windows installers for Python applications

Pynsist is a tool to build Windows installers for your Python applications. The installers bundle Python itself, so you can distribute your applicatio

Thomas Kluyver 818 Jan 5, 2023
Subpar is a utility for creating self-contained python executables. It is designed to work well with Bazel.

Subpar Subpar is a utility for creating self-contained python executables. It is designed to work well with Bazel. Status Subpar is currently owned by

Google 550 Dec 27, 2022
Python Wheel Obfuscator

pywhlobf obfuscates your wheel distribution by compiling python source file to shared library.

Hunt Zhan 79 Dec 22, 2022
FreezeUI is a python package that creates applications using cx_freeze and GUI by converting .py to .exe .

FreezeUI is a python package use to create cx_Freeze setup files and run them to create applications and msi from python scripts (converts .py to .exe or .msi .

null 4 Aug 25, 2022
Psgcompiler A PySimpleGUI Application - Transform your Python programs in Windows, Mac, and Linux binary executables

psgcompiler A PySimpleGUI Application "Compile" your Python programs into an EXE for Windows, an APP for Mac, and a binary for Linux Installation Old-

PySimpleGUI 77 Jan 7, 2023
Python-easy-pack For Linux/Unix, Changed by laman28

Python-easy-pack For Linux/Unix, Changed by laman28

LMFS 2 Jan 28, 2022
A library which implements low-level functions that relate to packaging and distribution of Python

What is it? Distlib is a library which implements low-level functions that relate to packaging and distribution of Python software. It is intended to

Python Packaging Authority 29 Oct 11, 2022