4

これは、特定の必要性というよりも好奇心から出たちょっとしたランダムな質問です。

Pythonコードをファイルに保存せずに、ソースコード自体を含むいくつかのものを出力するPythonコードを書くことは可能ですか? たとえば、Bash プロンプトで次のように実行します。

$ echo '
> print "The Code:"
> PrintScript() # What would this function look like?
> for i in range(5):
>     print i,
> print "!"
> ' | python

次のような出力を取得します。

The Code:
print "The Code:"
PrintScript() # What would this function look like?
for i in range(5):
    print i,
print "!"
0 1 2 3 4 5 !

これはおそらく実行できないと思いますが、python のイントロスペクション機能を考えると、このレベルまで拡張されているかどうか知りたいと思っていました。

4

4 に答える 4

3

それは私が得ている最も近いものです:

echo 'import  __main__,inspect;print inspect.getsource(__main__)' | python

これは失敗します... いずれにせよ、元のコードは起動時にインタープリターによって食べられます (stdin から読み取られます)。__main__せいぜい、モジュールを介して、コンパイルされたコードに到達できる可能性があります。

アップデート:

モジュールは、disモジュール内のすべての関数の逆アセンブリを提供することになっていますが、それでもコードは表示されません。

$ echo -e 'import  __main__,dis;print dis.dis(__main__)' | python
None

そして、私が関数を投げたときでさえ:

$ echo -e "import  __main__,dis;print dis.dis(__main__)\ndef x():\n pass" | python
None
于 2010-06-30T09:28:28.007 に答える
3

はい、それ自体のソースを出力するプログラムを書くことは確かに可能です。このタスクにはイントロスペクションさえ必要ありません。計算された文字列を出力できる必要があるだけです (すべての言語で動作します)。

この手法はQuineと呼ばれ、Python でのかなり短い例を次に示します。

quine = 'quine = %r\r\nprint quine %% quine'
print quine % quine

しかし、クインはそのような単純なプログラムに限定されません。たとえば、独自のソースを逆に印刷するなど、もっと多くのことができます... :)

于 2010-06-30T09:35:54.480 に答える
1

print open(__file__).read(),

これは私が思うUNIXシステムで動作しますが、Windowsについてはよくわかりません。末尾のコンマは、余分な末尾の改行なしで、ソースコードが正確に印刷されることを保証します。

(以下のコメントに基づいて)ソースコードがからのものである場合、これは機能しないことに気づきましたsys.stdin。これはまさにあなたが求めていたものです。その場合、Pythonのクワイン(独自のソースコードを出力するプログラム)についてこのページで概説されているアイデアのいくつかを利用できますが、どのソリューションも、機能する単一の関数ではありません。言語に依存しない議論はここにあります。

つまり、要するに、ソースコードが標準入力からのものである場合、これは単一の関数では不可能だと思います。プログラムの解釈された形式にPythonコードオブジェクトとしてアクセスし、それをソース形式に変換し直す可能性があるかもしれませんが、変換された形式は、ほぼ確実に元のファイルの内容と正確に一致しません。(たとえば、コメントとシバンラインは間違いなく削除されます)。

于 2010-06-30T09:12:56.787 に答える
1

あなたが得ることができる最も近いのは、私が見ることができるものから利用可能な場合、コマンド履歴を調べるために readline を使用することです。

于 2010-06-30T10:10:59.213 に答える