手を上げるキュビットくんゆるふわ量子コンピュータ
計算中のキュビットくん

Qiskitのexecuteが使えない|廃止の理由と直し方【2026年版】

2026-10-14 ・ 実践

#Qiskit#エラー対処#マイグレーション#実践

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。

Python
# 旧(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を実行すると、次のエラーになります。

Python
from qiskit import QuantumCircuit, execute
ImportError: cannot import name 'execute' from 'qiskit'

直し方は、importをtranspileに変えて、実行部分を2行に分けるだけです。

Python
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量子ビットの自作ユニタリゲートを制御ゲートにして、より大きな回路に組み込んだ例です(ショアのアルゴリズムの実装記事で使っている、位数発見用の制御ユニタリと同じ考え方です)。

Python
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)を挟むだけで解消します。

Python
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。

次に読むなら

参考資料・出典

ゆるふわポータルでは、一次情報・公的資料にもとづき、専門用語をできるだけやさしく翻訳することを心がけています。内容に誤りや古い情報がある場合は、お問い合わせからご連絡ください。

執筆:ゆるふわ量子編集部 最終更新日:2026年10月14日

Footnotes

  1. IBM Quantum, "Qiskit v1.0 feature changes" (migration guide). qiskit.executeがQiskit 1.0で廃止されたこと、transpile+backend.run()への置き換え、プリミティブ対応バックエンドではSamplerが代替になること、lintプラグインの検出範囲の限界について説明している。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6

  2. Purdue University, "AQCIII-00 Recitation" (2026年3月付け講義資料)。現行のQiskitワークフローではexecuteを使わずtranspileとqiskit_aer.AerSimulatorを使うと説明している。 ↩

この記事をシェア:𝕏 で共有LINEで送る

🔥 この分野の最新トレンドをチェック →

あわせて読みたい