标签: pyc

如何防止python使用孤立的.pyc文件?(没有匹配的.py文件)

偶尔我会遇到一个非常难以调试的问题:在我的$ PYTHONPATH中有一个剩余的.pyc文件,并且匹配的.py文件已被移动到稍后在$ PYTHONPATH的其他地方 - 所以当我尝试要导入模块,使用"孤立".pyc文件,并且忽略对"真实".py文件的所有更改,让我感到非常困惑,直到我发现正在发生的事情.

有没有办法使python 使用"孤立".pyc文件,或在使用它们时打印警告?
或者,我有这个问题的事实是否意味着我做错了什么,如果是的话,那是什么?

python bytecode pyc

18
推荐指数
2
解决办法
2706
查看次数

逆向工程.pyd文件有多难?

阅读后如何保护Python代码?,我决定在Windows上尝试一个非常简单的扩展模块.我之前在Linux上编译了自己的扩展模块,但这是我第一次在Windows上编译它.我期待得到一个.dll文件,但相反,我得到了一个.pyd文件.Docs说他们有点相同,但它必须有一个init[insert-module-name]()功能.

假设它是安全的,像dll文件一样难以对它们进行反向工程.如果没有,那么从.pyc文件到.dll文件的规模进行逆向工程的硬度是多少?

python reverse-engineering pyd pyc

16
推荐指数
1
解决办法
3万
查看次数

分发.pyc文件有什么限制?

我已经开始使用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在没有来源的情况下分发可能会给他们一定程度的安慰,因为它需要额外的反编译步骤来获取来源,即使这一步有些微不足道.这足以让诚实的人保持诚实.

python pyc

15
推荐指数
1
解决办法
5498
查看次数

与.py文件相比,为什么.pyc文件的"运行"速度不快?

我知道.py和.pyc文件之间的区别.我的问题不是关于如何,而是关于为什么根据文档:

从.pyc或.pyo文件读取程序时,程序运行速度不比从.py文件读取时运行速度快; 关于.pyc或.pyo文件,唯一更快的是它们加载的速度.

.pyc文件加载导入速度更快.但加载.pyc文件的'running'部分后,与.py文件中的'running'部分相同?这是为什么?我希望如此

  • 位代码(.pyc)更接近Python虚拟机,因此运行速度更快
  • .py文件在被执行之前被编译为.pyc.这需要额外的步骤,因此花费时间.

我的问题:在导入部分之后,为什么.py文件的运行部分与.py文件相比不会加快执行速度?

python pyc

14
推荐指数
2
解决办法
4770
查看次数

如何在Python 3中找到.pyc标头的幻数

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 pyc python-3.x

13
推荐指数
2
解决办法
2254
查看次数

如何在客户环境中运行python生产

我有一些应该在客户站点上运行的python应用程序.我将我的py文件编译为pyc(python字节代码).

在客户环境中运行应用程序的标准方法是什么?我看到的选项是:

  • 作为我的安装程序的一部分,安装一些python发行版,即Anaconda.
  • 要求客户在其环境中安装python.
  • 将python库和可执行文件与我的代码一起使用,并直接从我的安装目录运行它.
  • 使用一些py-to-exe工具将脚本转换为exe.

应用程序用法:该应用程序用作计算主要产品统计信息的工具.客户不会明确地运行它.它没有任何GUI.

客户环境将是x64 Windows机器.没有其他限制.

有什么建议或意见吗?我无法在网上找到这样的讨论.

python production python-install pyc python-3.x

11
推荐指数
1
解决办法
2006
查看次数

在 PyCharm 中无法查看 pyc 文件

我正在将 PyCharm 用于项目,并且需要访问pyc文件。不幸的是,IDE 似乎不显示*.pyc文件,也不显示文件__pycache__,即使在使用 double Shift+进行搜索时也是如此Shift。我找不到有关它的设置或文档。您知道如何在 IDE 中显示这些文件和文件夹吗?

python pyc pycharm

11
推荐指数
1
解决办法
4257
查看次数

生产容器中是否应该包含 __pycache__ 文件夹?

我想知道将__pycache__文件夹和.pyc文件保存在内置容器中是好还是坏做法。

一方面,您希望最小化容器的大小,但另一方面,您也不希望减慢容器的执行速度。

考虑到 python 解释器是静态的,这些文件也可以被认为是静态的。

有人做过一些性能测试并得出结论吗?

python containers pyc

10
推荐指数
1
解决办法
6216
查看次数

编译脚本的字节代码根据编译方式而有所不同

当天早些时候,我正在大量尝试使用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)

第一个参数是字符串形式的代码,第二个参数用于调试目的(将其留空即可),而第三个参数是模式.我都试过singleexec.结果是一样的.

在此之后,您可以使用反编译字节码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 bytecode disassembly pyc python-internals

9
推荐指数
1
解决办法
634
查看次数

Python 2和3,字节码(pyo&pyc)向后兼容吗?

Python 2和3,字节码(pyo&pyc)向后兼容吗?

我可以用python 3执行python 2 pyo&pyc文件吗?

python bytecode backwards-compatibility pyc

8
推荐指数
1
解决办法
1145
查看次数