Apakah mungkin untuk mendekompilasi file .pyc yang dikompilasi menjadi file .py?

178

Apakah mungkin untuk mendapatkan beberapa informasi dari file .pyc yang dihasilkan dari file .py?

Howard
sumber

Jawaban:

169

Uncompyle6 berfungsi untuk Python 3.x dan 2.7 - opsi yang disarankan karena merupakan alat terbaru, yang bertujuan untuk menyatukan garpu sebelumnya dan berfokus pada pengujian unit otomatis. The Halaman GitHub memiliki rincian lebih lanjut.

  • jika Anda menggunakan Python 3.7+, Anda juga bisa mencoba decompile3 , sebuah garpu dari Uncompyle6 yang berfokus pada 3.7 dan lebih tinggi.
  • lakukan mengangkat masalah GitHub pada proyek-proyek ini jika diperlukan - keduanya menjalankan unit test suites pada berbagai versi Python

Uncompyle2 yang lebih lama hanya mendukung Python 2.7. Ini bekerja dengan baik bagi saya beberapa waktu lalu untuk mendekompilasi bytecode .pyc ke .py, sedangkan unpyclib mengalami crash dengan pengecualian.

Dengan semua alat ini, Anda mendapatkan kode kembali termasuk nama variabel, tetapi tanpa komentar.

RichVel
sumber
7
Terima kasih banyak. Saya tidak sengaja menghapus file .py saya, bukan .pyc. Ini menyelamatkan saya dari keharusan menulis ulang dari awal.
avmohan
20
Bagi Anda di sini karena Anda tidak sengaja menghapus file yang salah, saya sangat merekomendasikan kontrol sumber!
Andrew Palmer
30

Ya, Anda bisa mendapatkannya dengan unpyclibitu dapat ditemukan di pypi .

$ pip install unpyclib

Daripada Anda dapat mendekompilasi file .pyc Anda

$ python -m unpyclib.application -Dq path/to/file.pyc
Pokutnik
sumber
20
Saya mencoba ini dan itu jatuh dengan pengecualian, pada file yang cukup kecil tanpa kode kompleks (Django settings.py) - uncompyle2 bekerja dengan baik sebagai gantinya. -1 untuk alasan itu.
RichVel
9
Itu jatuh di Python 3.6 di lib \ situs-paket \ unpyclib \ applcation.py dengan print __copyright- mengapa menggunakan versi Python 2.7 printtanpa tanda kurung?
David Ching
1
@DavidChing unpyclibrilis pertama dan terakhir pada tahun 2009 , aman untuk mengatakan itu adalah program hanya Python 2.
Boris
28

Anda dapat mencoba Easy Python Decompiler . Ini didasarkan pada Decompyle ++ dan Uncompyle2. Ini mendukung penguraian versi python 1.0-3.3

Catatan: Saya penulis alat di atas.

Coders Ekstrim
sumber
5
Itu melakukan tugasnya. Kerja bagus. BTW, apakah Anda menulis alat ini dengan python?
shinzou
1
Bekerja dengan baik untuk saya (drag and drop mudah). Memang benar bahwa distro linux akan menyenangkan, tetapi tidak terlalu sulit untuk membuka kotak windows.
Brian Jackson
Rilis terakhir pada tahun 2015 dan sepertinya sumber tertutup?
Boris
13

Decompyle ++ (pycdc) adalah satu-satunya yang bekerja untuk saya: https://github.com/zrax/pycdc

disarankan dalam Decompile Python 2.7 .pyc

Kenneth Hoste
sumber
1
Dan ini bekerja untuk saya untuk kode yang dikompilasi dengan Python 2.6!
David Mertens
4

Ya .

Saya menggunakan dekompilasi uncompyle6 (bahkan mendukung Python 3.8.0 terbaru):

uncompyle6 utils.cpython-38.pyc > utils.py

dan python asal dan membandingkan python membandingkan terlihat seperti ini:

Utilitas kompilasi pyc

sehingga Anda dapat melihat, HAMPIR sama, efek dekompilasi SANGAT BAIK .

crifan
sumber
3

Ya itu mungkin.

Ada dekompiler open-source Python (.PYC) yang sempurna, yang disebut Decompyle ++ https://github.com/zrax/pycdc/

Decompyle ++ bertujuan untuk menerjemahkan kode byte Python yang dikompilasi kembali menjadi kode sumber Python yang valid dan dapat dibaca manusia. Sementara proyek-proyek lain telah mencapai ini dengan keberhasilan yang bervariasi, Decompyle ++ unik karena berupaya mendukung kode byte dari versi Python apa pun.

Andrew Rukin
sumber
2
Meskipun pycdc baik, itu tidak sempurna. Jika Anda melihat masalah github.com/zrax/pycdc/isue, ada lebih dari 50 jenis masalah yang ada dalam dekompilasi. Namun ini tersebar di 16 atau lebih rilis python, dan bahasa dan kode telah berubah secara drastis. Mungkin karena hal-hal yang telah Anda coba, Anda belum dapat menemukan masalah. Namun, menurut pendapat saya, untuk mengklasifikasikan sesuatu sebagai "sempurna", orang harus mengambil mengatakan seluruh pustaka Python untuk setiap versi, mendekompilasi, dan membuatnya lulus tes sendiri dengan benar. Tidak ada decompiler yang bisa melakukannya.
berbatu
1

Instal menggunakan pip install pycompyle6

pycompyle6 filename.pyc

Banik Kuntal
sumber