質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

7256閲覧

Pythonのプログラムを一行ずつ実行したい

namuyan

総合スコア76

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/03/07 02:54

Python3.5を使用しています。
具体的には、あるファンクションについて一行ずつ実行し、ある実行回数を超えるとコード強制終了する機構を組み入れたいです。
通常ならばpdbを使用しますがDebugをするわけでは無いし、人がマニュアル的にEnterキーを押すわけでは無いのでうまく使用法が思いつきませんでした。

Python

1from hashlib import sha256 2import nazonolib # 一行ずつ実行できる謎のライブラリ 3 4 5def test(s): 6 h = b'' 7 While s < 100: 8 h += sha256(s.to_bytes(1, 'big')).digest() 9 return sha256(h).hexdigest() 10 11 12work = nazonolib.get(test, args=(1,)) # functionをインポートして 13limit = 100 14while limit > 100: 15 r = work.next() # 一行ずつ実行 16 if r is None: 17 limit -= 1 18 else: 19 # 無事に全経路を実行 20 break 21else: 22 # 途中で終わってしまった 23 work.close()

以上のコードは”こんな風にできたらいいなぁ”という妄想です。
hashlibなどBuildinは1ステップで計算したいです。
なにか良い方法はありませんか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Udomomo

2018/03/07 03:47 編集

どんなコードも1行ずつ実行されるので、イメージのコードも単に関数を100回実行するのと同じ気がしますが...関数の処理途中で変数の値などが変化するのを追いたいということでしょうか?
mkgrei

2018/03/07 04:24

def test(s)にwhile上限を設ける引数を渡せば良いように感じるのですが…時間ではなく行数が重要な理由は何でしょう。
namuyan

2018/03/07 15:29

function testはあくまで例です、内部は単純なコードの繰り返しではありません。時間で制限するとPCにより処理が正しく完了したり時間切れで止まったり不正確です、行数にこだわっているのはどのPCでも必ず同じ結果になることを求めているからです。
guest

回答2

0

python ide ステップ実行
などで google 検索すると、いろいろな情報を得られます。

  • デバッガーでコードを実行する

https://docs.microsoft.com/ja-jp/visualstudio/python/tutorial-working-with-python-in-visual-studio-step-04-debugging

...
Visual Studio は、プロジェクト管理、豊富な編集機能、対話型ウィンドウに加え、Python コードを完全にデバッグする機能も提供しています。
...

  • python開発環境

http://org.okinawa/archives/837090.html

...
【最低欲しいのは以下の機能】
・ブレークポイントで処理を止める
・ステップ実行
・変数の値の確認
・無償利用可能な事
...

投稿2018/03/07 18:37

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

やったことはないですが

https://docs.python.org/3/library/pdb.html

これみますとデバッガー配下で実行できるので、デバッガーとの対話(stdin/stdout)を自前で制御すればご質問のようなことができる気がします。


もう少しリファレンスを見てみましたが、pdb.Pdb、cmd.Cmdクラスのあたりを熟読すれば自前でデバッガーを作ることもできるぐらいの機能があるように思えます(拾い読みなので思えますとしか言えませんが)。

The debugger is extensible – it is actually defined as the class Pdb. This is currently undocumented but easily understood by reading the source. The extension interface uses the modules bdb and cmd.

とあり「関連するソースを読めばそう難しくないと思います」だそうです。

cmd.Cmdクラスがデバッグ中のプログラムに対して「どう制御したいか」を支配するみたいに思えます。普通のpdbの動きはstdin,stdouを用いて「今どの行で止まったかのメッセージ」をCmdへ伝えCmdはそれをstdoutへ出力した後、stdinからユーザーの指示を読み取りそれが's'(ステップ実行)ならその旨制御するみたいな作りだと思います。stdin,stdoutを使わずCmdが自動的にどう動くべきかを指示するような作りになるでしょうから実際にはstdin/stdoutをどうするかというよりcmd.Cmdの役割(機能)を調べるのがポイントかと思います。


もし、多くのプログラマーが必要とするような応用分野があるならこうした低水準な機能の上に使いやすいラッパーモジュールとして誰かが既に開発していると思います。そういう観点で探すと見つかるかも知れませんが・・・

はっきりわかりませんが「プログラムの動きを1行ずつ制御する」というのはデバッガーを作るという目的、あるいは何かのテストツール(カバレージ測定とか?)以外で、普通の応用プログラムから利用する場面が思いつきません。探すと見つかるかも知れませんが自分ならcmd.Cmdを調べてちょっとやってみようと考えます。(興味に従って「時間を使ってもあまり気にしない」というアマチュアの感覚で物をいっております)

投稿2018/03/07 04:43

編集2018/03/07 16:10
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

namuyan

2018/03/07 15:35

(stdin/stdout)を自前で制御ですか? どんなコードを書けばいいのか....
KSwordOfHaste

2018/03/07 16:04

ちょっと追記してみました。
KSwordOfHaste

2018/03/08 06:24 編集

FUSE...これも「デバッガー」とか「開発ツール」っぽい(システムプログラミングっぽい)香りがしますが、こんな機能がカーネルにあるんだなぁというところに感心しました。 > プロセスを分離 自分はご質問のコードを拝見したとき、デバッグ対象の関数があたかも1行実行するごとにyieldしているジェネレータのごとく見えるようにするラッパー機能みたいなものをイメージしておられるような気がしました。in-processでそういうものを作るなら別スレッドをおこしそこでpdb制御下で動かしつつラッパーオブジェクトが1ステップ実行する度に呼び出し元へyieldする様子を想像しました。ややこしそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問