Uncompyle6将整个目录中的Python 3编译后的pyc文件转换为py文件

4
我有一个文件夹里有200个pyc文件需要转换。我知道可以通过uncompyle6 -o . 31.pyc将pyc文件转换为py文件,但是由于我有这么多pyc文件,这将需要很长时间。我找到了很多文档,但没有批量转换为py文件的方法。uncompyle6 -o . *.pyc不被支持。
你有什么想法可以实现这个?

我认为不支持文件夹。真遗憾。 - user8900239
4个回答

6
可能不是完美的,但它对我非常有效。
import os
import uncompyle6
your_directory = ''
for dirpath, b, filenames in os.walk(your_directory):
    for filename in filenames:
        if not filename.endswith('.pyc'):
            continue

        filepath = dirpath + '/' + filename
        original_filename = filename.split('.')[0]
        original_filepath = dirpath + '/' + original_filename + '.py'
        with open(original_filepath, 'w') as f:
            uncompyle6.decompile_file(filepath, f)

6

这是由uncompyle6本地支持的。

uncompyle6 -ro <output_directory> <python_directory>
  • -r 选项告诉工具递归进入子目录。
  • -o 选项告诉工具将输出到给定的目录。

4

在具有shell文件名扩展功能的操作系统中,您可以使用shell的文件扩展能力。例如:

uncompyle6 -o /tmp/unc6 myfiles/*.pyc

如果你需要更高级或更多控制的内容,你可以编写一些代码来实现更高级的扩展。以下是使用POSIX shell过滤单个文件myfiles/huge.pyc的示例:

cd myfiles
for pyc in *.pyc; do 
   if [[ $pyc != huge.pyc ]] ; then 
     uncompyle -o /tmp/unc $pyc
   fi 
done

注意:看起来这个问题也被提出在使用Windows批处理命令“FOR /R”执行命令时的输出目录问题中。


另外,对于 /r %v in (*.pyc) do uncompyle6 -o . "%v" "%vx" :), 如果需要的话,您也可以通过 os.popen 在 Python 中运行它。 - user8900239
非常方便的工具。但我不确定如何获取PyInstaller的源代码/相关pyc文件。你有什么想法吗?https://stackoverflow.com/questions/47441287/how-to-decompile-pyinstaller-created-exe-and-get-source-code - user8900239

0

感谢您的代码,将其扩展为递归调用、嵌套子目录,保存为uncompile.py,在要转换的目录中,运行命令提示符键入“python uncomple.py”,将会在当前工作目录中将pyc转换为py,并具有错误处理机制。如果重新运行,则跳过(恢复)文件检查现有的py扩展名匹配。

import os
import uncompyle6
# 使用当前工作目录 your_directory = os.getcwd()
# 处理当前目录的函数 def uncompilepath(mydir): for dirpath, b, filenames in os.walk(mydir): for d in b: folderpath = dirpath + '/' + d print(folderpath)
# 递归子目录调用 uncompilepath(folderpath) for filename in filenames: if not filename.endswith('.pyc'): continue filepath = dirpath + '/' + filename original_filename = filename.split('.')[0] original_filepath = dirpath + '/' + original_filename + '.py'
# 如果已经反编译,则忽略 if os.path.exists(original_filepath): continue with open(original_filepath, 'w') as f: print(filepath)
# 错误处理 try: uncompyle6.decompile_file(filepath, f) except Exception: print("错误") uncompilepath(your_directory)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接