偶尔我会遇到一个非常难以调试的问题:在我的$ PYTHONPATH中有一个剩余的.pyc文件,并且匹配的.py文件已被移动到稍后在$ PYTHONPATH的其他地方 - 所以当我尝试要导入模块,使用"孤立".pyc文件,并且忽略对"真实".py文件的所有更改,让我感到非常困惑,直到我发现正在发生的事情.
有没有办法使python 不使用"孤立".pyc文件,或在使用它们时打印警告?
或者,我有这个问题的事实是否意味着我做错了什么,如果是的话,那是什么?
阅读后如何保护Python代码?,我决定在Windows上尝试一个非常简单的扩展模块.我之前在Linux上编译了自己的扩展模块,但这是我第一次在Windows上编译它.我期待得到一个.dll文件,但相反,我得到了一个.pyd文件.Docs说他们有点相同,但它必须有一个init[insert-module-name]()功能.
假设它是安全的,像dll文件一样难以对它们进行反向工程.如果没有,那么从.pyc文件到.dll文件的规模进行逆向工程的硬度是多少?
我已经开始使用Python开发商业应用程序了,我正在权衡如何分发应用程序的选项.
除了显而易见的(分发具有适当商业许可证的来源)之外,我正在考虑仅分发.pyc没有相应.py来源的文件.但是我不太熟悉Python的兼容性保证,知道这是否可行,更不用说它是否是一个好主意.
.pyc文件是否独立于底层操作系统?例如,.pyc在64位Linux机器上生成的文件是否可以在32位Windows机器上运行?
我发现该.pyc文件应该与bugfix版本兼容,但主要和次要版本呢?例如,使用Python 3.1.5生成的文件是否与Python 3.2.x兼容?或者.pyc使用Python 2.7.3生成的文件是否与Python 3.x版本兼容?
编辑:
首先,我可能不得不安抚那些不愿意分发来源的利益相关者..pyc在没有来源的情况下分发可能会给他们一定程度的安慰,因为它需要额外的反编译步骤来获取来源,即使这一步有些微不足道.这足以让诚实的人保持诚实.
我知道.py和.pyc文件之间的区别.我的问题不是关于如何,而是关于为什么根据文档:
从.pyc或.pyo文件读取程序时,程序运行速度不比从.py文件读取时运行速度快; 关于.pyc或.pyo文件,唯一更快的是它们加载的速度.
.pyc文件加载导入速度更快.但加载.pyc文件的'running'部分后,与.py文件中的'running'部分相同?这是为什么?我希望如此
我的问题:在导入部分之后,为什么.py文件的运行部分与.py文件相比不会加快执行速度?
Python字节码(.pyc)文件有一个标题,以在Python版本之间更改的幻数开头.我如何(以编程方式)找出当前Python版本的数字以生成有效的标头?我目前正在为Python 3.7.1编写硬编码,但这意味着我现在依赖于特定的Python版本.
这个答案完全符合我的要求py_compile.MAGIC,但在Python 3中似乎不再存在.如何在Python 3中完成相同的操作?
这是我正在尝试做的一个例子:
import dis
import marshal
PYC_HEADER = b'\x42\x0d\x0d\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
def f():
print('Hello World')
with open('test.pyc', 'wb') as pyc:
pyc.write(PYC_HEADER)
marshal.dump(dis.Bytecode(f).codeobj, pyc)
Run Code Online (Sandbox Code Playgroud)
这应该创建一个文件test.pyc,然后可以使用与脚本相同的Python解释器运行,并且应该打印"Hello World!".它确实如此,但只有在使用Python 3.7时才会这样.我正在寻找一种方法来生成用于运行脚本的Python 3版本的标头,而不是硬编码3.7.
对于上下文:
我正在编写一个简单的编程语言到不同的字节码格式(LLVM,Java字节码,Web汇编和现在的Python字节码),作为计划编译的计划教程系列的一部分.
我可以使用byteasm库生成Python字节码,这给了我一个函数作为结果.但是为了将内容写入.pyc文件,我需要一个有效的头.通过对头文件进行硬编码,只有遵循本教程的人员运行与我相同版本的Python 3(3.7)或者他们必须手动找到其版本的幻数时,代码才会起作用.
我有一些应该在客户站点上运行的python应用程序.我将我的py文件编译为pyc(python字节代码).
在客户环境中运行应用程序的标准方法是什么?我看到的选项是:
应用程序用法:该应用程序用作计算主要产品统计信息的工具.客户不会明确地运行它.它没有任何GUI.
客户环境将是x64 Windows机器.没有其他限制.
有什么建议或意见吗?我无法在网上找到这样的讨论.
我正在将 PyCharm 用于项目,并且需要访问pyc文件。不幸的是,IDE 似乎不显示*.pyc文件,也不显示文件__pycache__,即使在使用 double Shift+进行搜索时也是如此Shift。我找不到有关它的设置或文档。您知道如何在 IDE 中显示这些文件和文件夹吗?
我想知道将__pycache__文件夹和.pyc文件保存在内置容器中是好还是坏做法。
一方面,您希望最小化容器的大小,但另一方面,您也不希望减慢容器的执行速度。
考虑到 python 解释器是静态的,这些文件也可以被认为是静态的。
有人做过一些性能测试并得出结论吗?
当天早些时候,我正在大量尝试使用docstrings和dis模块,并且遇到了一些我似乎找不到答案的东西.
首先,我创建一个test.py包含以下内容的文件:
def foo():
pass
Run Code Online (Sandbox Code Playgroud)
就是这样,没有别的.
然后我打开一个解释器来观察程序的字节码.你可以这样得到它:
code = compile(open('test.py').read(), '', 'exec')
Run Code Online (Sandbox Code Playgroud)
第一个参数是字符串形式的代码,第二个参数用于调试目的(将其留空即可),而第三个参数是模式.我都试过single和exec.结果是一样的.
在此之后,您可以使用反编译字节码dis.
>>> import dis
>>> dis.dis(code)
Run Code Online (Sandbox Code Playgroud)
字节码输出是这样的:
1 0 LOAD_CONST 0 (<code object foo at 0x10a25e8b0, file "", line 1>)
3 MAKE_FUNCTION 0
6 STORE_NAME 0 (foo)
9 LOAD_CONST 1 (None)
12 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
合理的,对于这样一个简单的脚本.它也是有道理的.
然后我尝试通过命令行编译它,如下所示:
$ python -m py_compile test.py
Run Code Online (Sandbox Code Playgroud)
这导致生成字节码并将其放置在test.pyc文件中.内容可以再次拆卸:
>>> import dis
>>> dis.dis(open('test.pyc').read())
Run Code Online (Sandbox Code Playgroud)
这是输出:
>> 0 ROT_THREE
1 <243> 2573
>> 4 …Run Code Online (Sandbox Code Playgroud) Python 2和3,字节码(pyo&pyc)向后兼容吗?
我可以用python 3执行python 2 pyo&pyc文件吗?
pyc ×10
python ×10
bytecode ×3
python-3.x ×2
containers ×1
disassembly ×1
production ×1
pycharm ×1
pyd ×1