Jak chronić kod źródłowy Pythona?

Czy można dystrybuować tylko wersję kodu bajtowego (.plik pyc) skryptu Pythona zamiast oryginalnego pliku. py? Moja aplikacja osadza interpreter Pythona i wywołuje PyImport_Import, aby załadować skrypt. Jak mogę powiedzieć, aby szukać .plik pyc i import?

Author: Nathan Osman, 2010-01-13

5 answers

Zrobiłem to tworząc bibliotekę. py i prosty program .py, który używa tej biblioteki. Potem skompilowałem bibliotekę do .pyc i rozproszone: program jako źródło. py i biblioteka jako skompilowane .pyc.

 5
Author: Michał Niklas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-13 08:38:53

Użyj narzędzia freeze , które jest zawarte w drzewie źródłowym Pythona jako Tools/freeze . Konwertuje kod bajtowy Pythona na tablice C; za pomocą kompilatora C możesz osadzić wszystkie swoje moduły w nowym programie, który jest następnie połączony ze standardowymi modułami Pythona.

Zauważ, że freeze wymaga kompilatora C.

Inne narzędzia:

1- PyInstaller

2- Py2Exe

3- Squeeze

4- cx_freeze

Więcej informacji na effbot.org

 13
Author: Michel Gokan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-09 20:35:08

Ponieważ piszesz swój główny program w C++, możesz zrobić wszystko, co chcesz, aby chronić swoje pliki Pythona. Możesz zaszyfrować je do dystrybucji, a następnie odszyfrować w samą porę, aby zaimportować je na przykład do interpretera Pythona.

Ponieważ używasz PyImport_Import, możesz napisać własny hook __import__, aby zaimportować Moduły nie z pliku, ale z bufora pamięci, więc twoja transformacja do .plik pyc może się zdarzyć wszystko w pamięci, bez zrozumiałego kodu Pythona na dysku w wszystkie.

 5
Author: Ned Batchelder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-13 12:44:11

To nie powinno być problemem, jeśli utworzysz samodzielny program za pomocą py2exe otrzymasz tylkopliki pyc.

Normalnie nie musisz mówić pythonowi, żeby szukał .pliki pyc, i tak to robi. Tylko jeśli istnieje nowszy plik źródłowy .py jest to używane.

Jednak poziom ochrony Twojego kodu źródłowego może nie być zbyt wysoki.

 2
Author: Ber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-13 08:37:10

W interaktywnym interpreterze jest to automatyczne-jeśli nie ma .py, to .pyc nadal będzie używany:

$ echo 'print "hello"' > test.py
$ python -m compileall .
$ rm test.py
$ python -m test
hello
$

Mógłbyś po prostu spróbować, jeśli to działa w ten sam sposób z API?

Edited to add: Zgadzam się z Berem w tym, że Twoja ochrona kodu będzie raczej słaba. -O usunie docstringi, jeśli to nie zmieni zachowania Twojego programu, co może utrudnić rekonstrukcję zachowania, ale naprawdę potrzebujesz jakiegoś zaciemnienia kodu bajtowego.

Nie wiem czy a gotowe narzędzie maskowania istnieje dla Pythona, ale to wydaje się realne, jeśli chcesz / możesz zainwestować czas (i nie czujesz się zbyt głupio robiąc to, i możesz wysłać własny interpreter).

 2
Author: Bernd Haug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-13 08:46:06