Everything that can be reconstructed. Impossible provide information about the user machine without the ability for the user to examine this information. All you can do is make more effort.
Python is especially bad if you have this requirement, because Python bytecode is much easier to read than fully compiled machine code. Ultimately, whatever you do to make it more confusing, the user computer must be able to confuse it in order to turn it into regular Python bytecode so that the Python interpreter can excrement it. Therefore, a motivated user will be able to de-confuse everything you give them in Python bytecode.
If you really have competitors who are likely to want to figure out how your programs work, you should assume that any code that you release to end users in any form will be fully understood by your competitors. There is no possible way to completely protect against this.
The only way you can get around this is to not give this code to your users if you can run your code on a server under your control and only give your users a dead end program that makes requests to your server for real work.
source share