2013-08-20 20 views
5

Bir komut dosyasının kaynak kodunu yazdırmak mümkün mü (python iç gözlemini kullanmıyor olabilir)?Kaynağını yazdırır Python komut dosyası

Ayrıca kaynağını da yazdıran kısa bir python komut dosyasını çalıştırmak istiyorum (böylece hangi komutların yürütüldüğünü görebilirim).

command1() 
#command2() 
command3() 

print some_variable_that_contain_src 

gerçek uygulamam run -i büyü ile ipython bir komut dosyası çalıştırmak istediğiniz ve çıktı olarak kaynağını (yani komutlar çalıştırılır) sahip olmasıdır:

komut dosyası aşağıdaki gibi bir şeydir. Bu şekilde her işlemde hangi komutların yorumlandığını kontrol edebilirim. Ayrıca, bir Defterde çalıştırılırsa, hangi komutların kullanıldığına dair bir iz bırakırım.

Çözüm

ben bu tek astar ile bitirmek çözüm programın başında konması korylprince kullanma:

with open(__file__) as f: print '\n'.join(f.read().split('\n')[1:]) 

Bu (ilk satır hariç komut kaynağını yazdırır Bu sadece gürültü olurdu). Ayrıca, betiğin farklı bir "dilimini" basmak için dilimlemeyi değiştirmek de kolaydır. Ben de incelemek paket programı kullanılarak çalıştı

import my_module 

print open(my_module.__file__).read() 

: en basit yanıt için

with open(__file__) as f: print f.read() 
+0

python: http://www.python.org/doc//current/library/inspect.html adresindeki inceleme paketine bakın. Spesifik olarak 'kaynak' yöntemi – Greg

+0

Bu tür programlara Quine programları denir. http://en.wikipedia.org/wiki/Quine_(computing) Kendimi python'a yazmayı deniyorum, çok zor. :( – thefourtheye

+0

Neden ilk satırı kaldırabilirsiniz? Çalıştırdığınızda, kaynak kodunun basılmasıyla ilgili hiçbir şey içermeyen kaynak kodu * basar. * Bu kafa karıştırıcıdır. yorum ya da iddialar şunlardır: – user2357112

cevap

8

sürece değiliz olarak size

for line in source_list[0]: 
    print line 

okunabilir şekilde tüm kaynak kodunu yazdırmak Will içerisinde tanımlı kaynak kodu ile dizeleri listesini verecek

with open(__file__) as f: 
    print f.read() 

okuyacak hangi paketleri ile çılgın bir şey yapıyor, komut üstündeki bu koymak geçerli dosyada ve yazdırın.

+0

Evet, bu sadece betiğin başlangıcına koyarsa çalışır, sonunda yazılırsa ve diğer betikleri çalıştırırsam son çalıştırılan dosya basılır. . – user2304916

4

: Bunun yerine tüm dosyayı yazdırmak isterseniz için

, tek satırlık kolaylaştırır.

import inspect 

import my_module 

source_list = inspect.getsourcelines(my_module) 

+0

Sadece çalıştırdığımdan, bir betik için çalışmaz, içe aktarma – user2304916

İlgili konular