Ну если совсем извратиться, то:
* зашифровать программу желаемым ключом
* написать лоадер, который просит у пользователя пароль, загружает файлы основной программы в память, расшифровывает их введённым ключом и пытается запустить точку входа в основную программу.
Тогда подглядеть ключ в лоадере не получится, как и оторвать сам лоадер. Разве что брутфорсить ключ, пытаясь найти такой ключ, который даст на выходе корректные питоновские скрипты.
Примерный путь будет:
1. Загрузить бинарные данные из файла как bytes
2. Расшифровать в памяти, получив исходники
3. Использовать
exec()
Альтернативно, вместо исходников можно шифровать байткод, но тогда придётся соображать, как превратить bytes в code object, который можно выполнить через exec(). Теоретически, может помочь
marshal.
Схема не 100% надёжная, разумеется.
А вообще, какая у тебя задача? Может, pyarmor подойдёт?