Qiskitをバージョンアップしたら、以前は動いていたコードがImportError: cannot import name 'execute'やAerError: unknown instructionで止まった――この2つはどちらも同じところが原因です。execute()関数とは、回路の変換(トランスパイル)と実行をまとめて行っていた高レベルな関数のことで、Qiskit 1.0で廃止されています1。現在はtranspile()で回路を実行先が理解できる基本ゲートに変換してからbackend.run()に渡す書き方に統一されました。この記事では、この2つのエラーを実際に手元で再現し、直し方をコードで確認します。
この記事で分かること
- execute()は『トランスパイル+実行』をまとめて行っていた関数で、Qiskit 1.0で廃止されている。代わりにtranspile(qc, backend)とbackend.run(...)を分けて呼ぶ
- AerError: unknown instructionは、シミュレータが直接実行できないゲート(自作のユニタリゲートや制御ユニタリなど)を、transpileせずにそのままrunに渡したときに出る
- どちらのエラーも『回路を実行前にtranspileしているか』を確かめれば直せる。Qiskit RuntimeのSamplerV2・EstimatorV2を使う場合も同じ注意が必要
対象読者:以前書いたQiskitのコードが、ライブラリをアップデートした後に動かなくなって困っているエンジニアの方
執筆:ゆるふわ量子編集部 最終更新日:2026年10月14日
なぜexecute()が廃止されたのか
Qiskitは2024年にリリースされたバージョン1.0から、大きな仕様変更(破壊的変更)は年1回のメジャーリリースにまとめるという方針に切り替わりました。この1.0で、qiskit.execute()が削除されています1。
execute(circuit, backend)は内部で「回路を実行先向けに変換する(transpile)」→「変換した回路を実行する(backend.run)」という2つの処理を順番に呼んでいただけの、いわば薄いラッパー関数でした。IBMの公式マイグレーションガイドも、この関数はtranspileとrunをまとめただけのものだったと説明し、廃止後は次のように書き換えるよう案内しています1。
# 旧(Qiskit 1.0未満)
from qiskit import execute
result = execute(qc, backend, shots=1000).result()
# 新(Qiskit 1.0以降)
from qiskit import transpile
result = backend.run(transpile(qc, backend), shots=1000).result()importの書き換えだけでは見つからないことがある
IBMが配布しているマイグレーション用のlintプラグイン(flake8-qiskit-migration)は、import元が変わった関数は検出できますが、executeのように関数そのものが削除されたケースまでは検出しません1。grep -rn "execute("などでコード全体を自分で確認する必要があります。
エラー①:ImportError: cannot import name 'execute'を直す
現在のQiskit(2.5系で確認)でfrom qiskit import executeを実行すると、次のエラーになります。
from qiskit import QuantumCircuit, executeImportError: cannot import name 'execute' from 'qiskit'直し方は、importをtranspileに変えて、実行部分を2行に分けるだけです。
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
backend = AerSimulator()
result = backend.run(transpile(qc, backend), shots=1000).result()
print(result.get_counts()){'00': 492, '11': 508}エラー②:AerError: unknown instructionが出るのはなぜか
もう1つよくあるのが、transpileを挟まずに回路をそのままrunに渡したときに出るAerErrorです。シミュレータは「自分が直接解釈できるゲートの一覧(basis gates)」しか実行できません。自作のUnitaryGateや、それを.control()で制御ゲート化したものは、この一覧に入っていない複合的な命令として扱われるため、トランスパイルで分解しないとシミュレータに渡せません。
次のコードは、1量子ビットの自作ユニタリゲートを制御ゲートにして、より大きな回路に組み込んだ例です(ショアのアルゴリズムの実装記事で使っている、位数発見用の制御ユニタリと同じ考え方です)。
import numpy as np
from qiskit import QuantumCircuit
from qiskit.circuit.library import UnitaryGate
from qiskit_aer import AerSimulator
perm = np.array([[0, 1], [1, 0]]) # 1量子ビットの置換(X相当)
gate = UnitaryGate(perm, label="custom_U").control()
qc = QuantumCircuit(2, 1)
qc.x(1) # 制御ビットを|1>にしておく
qc.append(gate, [0, 1])
qc.measure(1, 0)
backend = AerSimulator()
result = backend.run(qc, shots=100).result() # transpileせずに直接run
print(result.get_counts())AerError: 'unknown instruction: c-unitary'transpile(qc, backend)を挟むだけで解消します。
result = backend.run(transpile(qc, backend), shots=100).result()
print(result.get_counts()){'1': 100}エラーメッセージの読み方
unknown instruction: c-unitaryのc-unitaryは「制御付きユニタリゲート」を指す内部名です。unknown instruction: xxxという形のAerErrorが出たら、まず「xxxというゲートをtranspileせずにそのまま渡していないか」を疑ってください。
直すときの基本パターン
どちらのエラーも、直し方は同じ形に集約できます。
Qiskitでエラーが出たときの直し方
①エラー文を読む
ImportErrorかAerErrorかを確認
②execute()を分解
transpile()とbackend.run()に分ける
③必ずtranspileを通す
backend.run(transpile(qc, backend), ...)の形にする
④小さな回路で再現確認
直ったら元の大きな回路に反映
Qiskit Runtime入門で紹介したSamplerV2・EstimatorV2を使う場合も考え方は同じで、渡す回路は事前に対象バックエンドへtranspileしておく必要があります。クラウドの実機やシミュレータのノイズを再現したいときは、Qiskitのノイズモデルとトランスパイルで扱っているノイズ付きのtranspileも参考になります。
まとめ
execute()はQiskit 1.0で廃止されている。代わりにtranspile(qc, backend)とbackend.run(...)を分けて書くAerError: unknown instructionは、シミュレータの基本ゲートにない命令(自作のユニタリゲートなど)をtranspileせずに渡したときに出る- 直すときの基本形は
backend.run(transpile(qc, backend), shots=...)。この形にしておけば両方のエラーを避けられる - Qiskit RuntimeのSamplerV2・EstimatorV2でも、回路は事前にtranspileしておく必要がある
よくある質問
Q. transpileを省略してbackend.runだけ呼んでもいい?
A. 標準的なゲートだけの小さな回路なら動くこともありますが保証はありません。transpileは回路をシミュレータや実機が対応する基本ゲートに変換する工程なので、実行前には必ず通しておくのが安全です。
Q. 古いコードがどのバージョンから動かなくなったか調べる方法は?
A. pip show qiskitで現在の版を確認し、IBMの移行ガイドでそのバージョンの変更点を探します。古いバージョンを一時的に指定してインストールし動作を確認してから、新しい書き方へ計画的に移行する方法もあります。
Q. Qiskit RuntimeのSamplerやEstimatorでも同じエラーは起きる?
A. はい。SamplerV2やEstimatorV2に渡す回路も、実行前に対象のバックエンドへtranspileしておく必要があります。詳しくはQiskit Runtime入門の記事で扱っています。
もう少し詳しく(背景)
Qiskitは2024年2月リリースのバージョン1.0から、「大きな破壊的変更はメジャーバージョンの更新時にまとめて行う」という方針を取っています1。execute()の廃止はこの1.0での変更の1つで、IBMの移行ガイドでは、プリミティブ(SamplerやEstimator)に対応したバックエンドではexecute()の代わりにSamplerプリミティブを使うことも案内されています1。2026年3月時点の大学の講義資料でも、現在のQiskitではexecuteは標準の使い方ではなく、transpileとqiskit_aerのAerSimulatorを使うのが通常の流れだと説明されています2。
次に読むなら
- Qiskit入門|量子回路をPythonで書いて動かしてみる —
transpileやrunの基本をまだ触ったことがない方に - Qiskitのノイズモデルとトランスパイル — トランスパイルが回路をどう変換しているか、もう一歩詳しく知りたい方に
- ショアのアルゴリズムをQiskitで実装 — 今回の
unknown instructionエラーが実際に起きた、制御ユニタリゲートを使う実装例 - Qiskit Runtime入門|プリミティブで量子回路を実行する — SamplerV2・EstimatorV2で同じ注意点がどう関わるか知りたい方に
参考資料・出典
- Qiskit v1.0 feature changes | IBM Quantum Documentationexecute()の廃止とtranspile+backend.run()への置き換えを説明する公式マイグレーションガイド(本文は社内ネットワーク制限により検索結果の要約で確認、公式ページ本文では未確認)
- AQCIII-00 Recitation (2026年3月付け講義資料) | Purdue University現行のQiskitワークフローがtranspile・AerSimulatorを使う形であることを示す2026年の教材(検索結果の要約で確認)
ゆるふわポータルでは、一次情報・公的資料にもとづき、専門用語をできるだけやさしく翻訳することを心がけています。内容に誤りや古い情報がある場合は、お問い合わせからご連絡ください。
執筆:ゆるふわ量子編集部 最終更新日:2026年10月14日
Footnotes
-
IBM Quantum, "Qiskit v1.0 feature changes" (migration guide).
qiskit.executeがQiskit 1.0で廃止されたこと、transpile+backend.run()への置き換え、プリミティブ対応バックエンドではSamplerが代替になること、lintプラグインの検出範囲の限界について説明している。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 -
Purdue University, "AQCIII-00 Recitation" (2026年3月付け講義資料)。現行のQiskitワークフローでは
executeを使わずtranspileとqiskit_aer.AerSimulatorを使うと説明している。 ↩
