2013-08-20 39 views
5

Có thể (không cần thiết phải sử dụng nội suy python) để in mã nguồn của tập lệnh không?Kịch bản lệnh Python in mã nguồn của nó

Tôi muốn thực thi một tập lệnh python ngắn cũng in nguồn của nó (vì vậy tôi có thể xem các lệnh nào được thực hiện).

Kịch bản là một cái gì đó như thế này:

command1() 
#command2() 
command3() 

print some_variable_that_contain_src 

Các ứng dụng thực tế là tôi muốn chạy một kịch bản từ IPython với run -i kỳ diệu và có như đầu ra nguồn (ví dụ: các lệnh thực hiện). Bằng cách này, tôi có thể kiểm tra các lệnh nào được nhận xét ở mỗi lần thực hiện. Hơn nữa, nếu được thực thi trong Notebook, tôi để lại dấu vết của các lệnh nào đã được sử dụng.

Giải pháp

Sử dụng korylprince giải pháp tôi kết thúc với một-liner để được đưa vào đầu của kịch bản:

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

này sẽ in các nguồn kịch bản ngoại trừ dòng đầu tiên (đó sẽ chỉ là tiếng ồn). Nó cũng dễ dàng để sửa đổi cắt để in một "lát" khác nhau của kịch bản.

Nếu bạn muốn in toàn bộ tập tin thay vào đó, một trong những-liner đơn giản hoá để:

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

có thể xem xét gói kiểm tra trong python: http://www.python.org/doc//current/library/inspect.html. Cụ thể phương thức 'getource' – Greg

+0

Kiểu chương trình này được gọi là các chương trình Quine. http://en.wikipedia.org/wiki/Quine_(computing) Tôi đang cố gắng để viết một bản thân mình trong python, nó quá damn khó khăn. :( – thefourtheye

+0

Tại sao lại xóa dòng đầu tiên? Bạn nhận được một tập lệnh, khi chạy, in ra mã nguồn * không chứa bất cứ điều gì về việc in mã nguồn của nó * .Nó gây nhầm lẫn. Dòng đầu tiên không phải là tiếng ồn nhiều hơn – user2357112

Trả lời

8

Chừng nào bạn không làm bất cứ điều gì điên rồ với các gói, đặt phần này ở đầu tập lệnh của bạn

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

Điều gì sẽ đọc trong tệp hiện tại và in ra.

+0

Có, điều này chỉ hoạt động nếu được đặt ở đầu tập lệnh, nếu đặt ở cuối và tôi thực thi các tập lệnh khác thì tệp được thực thi cuối cùng sẽ được in . – user2304916

4

Đối với câu trả lời đơn giản nhất:

import my_module 

print open(my_module.__file__).read() 

Tôi cũng đã cố gắng sử dụng các gói kiểm tra.

import inspect 

import my_module 

source_list = inspect.getsourcelines(my_module) 

sẽ cung cấp cho bạn một danh sách các chuỗi với mã nguồn được định nghĩa trong nó

for line in source_list[0]: 
    print line 

sẽ in ra toàn bộ mã nguồn một cách dễ đọc

+0

Điều này không hoạt động đối với một tập lệnh vì tôi chỉ thực thi nó, không nhập nó – user2304916

Các vấn đề liên quan