朝日ネット 技術者ブログ

朝日ネットのエンジニアによるリレーブログ。今、自分が一番気になるテーマで書きます。

シェルスクリプトとの対比で理解するPythonのsubprocess

はじめに

開発部の ikasat です。

皆さんは git, ssh, rsync のような外部コマンドを呼び出すスクリプトを書きたくなったことはありますか? 個人的にこの類のスクリプトは最初はシェルスクリプトとして書くのですが、改修を重ねるうちに肥大化して処理も複雑になり、 後から Python のような汎用プログラミング言語で書き直すことがよくあります。

外部コマンド呼び出しを書き直す際に、Git 操作のために pygit2、 SSH 接続のために paramiko のようなライブラリをわざわざ使うのは大がかりだったり、 rsync に相当するようなこなれたライブラリが存在しなかったりする場合があります。 そのような時は標準ライブラリの subprocess モジュールを利用し、Python から外部コマンドを呼び出すことになるでしょう。

しかしながら、Python のチュートリアルページには subprocess モジュールの解説はなく、 いきなり標準ライブラリのリファレンスを読むことになります。 subprocess モジュールはバージョンアップに従いAPIが多数追加されており、また各種OSの事情が同じ箇所に記載されているため、一見して利用法をなかなか掴みにくいです。

この記事では対象環境を Linux に絞り、シェルスクリプトと Python スクリプトを対比した上で subprocess モジュールの典型的な利用方法について述べます。 また、記事の後半では subprocess モジュールの詳細に立ち入り、込み入ったケースでの注意点について記載します。

対象読者

  • subprocess を雰囲気で利用している人
    • 具体的には公式のリファレンスや巷の解説記事を多少読んで import subprocess したことがある人
  • はじめに
  • 対象読者
  • 対象環境
  • シェルスクリプトとPythonの比較
    • コマンドを起動する(最も単純な使い方)
    • 終了ステータスを取得する
    • 標準出力を捕捉する
    • 標準入出力をリダイレクトする
    • 標準エラー出力を標準出力にマージして捕捉する
    • 出力を全て捨てる
    • 終了ステータスが0でなければ例外を発生させる
    • Pythonのバイト列・文字列をコマンドに渡す
    • 並行処理を行う
    • Popen と communicate で標準入出力を扱う
    • パイプ処理を行う
    • タイムアウトを設定する
    • シェル経由でコマンドを起動する(要注意)
  • subprocessの詳細仕様と内部実装
    • プロセス間通信の流れ(概要)
    • プロセス間通信の実装(詳細)
    • 子プロセス同士をパイプする際に close が必要な理由
    • Pythonとパイプ書き込みエラー
    • デッドロックと communicate
  • おわりに
  • 採用情報
続きを読む

オブジェクト指向を5年間理解できなかった人間がオブジェクト指向を説明する(第5回)

こんにちは。朝日ネット社員のjiweenです。 今日もデザインパターンを分析します。

今回は、データとその処理を分離して扱うパターンが3つ(Iterator, Visitor, Observer)登場します。ここでは、第2回で説明した「データと振る舞いの一体化は強制されない」ということを思い出してください。どのパターンでもデータと振る舞いが本質的に別の流動性を持っており、そのため自然と分離が起こります。

続きを読む

エンジニアが家庭に浸かって成長した話 ~育児休業体験記~

朝日ネットのエンジニアのxfuzzy(男性)です。 私事ですが、妻が第一子を妊娠・出産し、私も育児休業(育休)を取得しましたので、育休取得の経緯や会社とのやり取りをレポートさせていただきます。

  • 育休制度の概要
  • 育休を取ると決めるまで
  • 育休前
  • 育休取得中
  • 育休後
    • 日々の業務で意識していること
  • まとめ
  • 採用情報
続きを読む

社内用ChatGPTクローンを公開して1か月

朝日ネットで技術部門の執行役員をしている草場です。 今回は朝日ネットが新しいことにも積極的に取り組む会社ですというアピールも込めて、 社内用ChatGPTクローン公開までの話と今後の展望を書きたいと思います。

  • 導入までの流れ
  • システム構成
  • ガイドライン
  • 今後について
  • 最後に
続きを読む

Algorithm Design with Haskellでアルゴリズムを学ぶ

はじめに

開発部のcbmkageです。 仕事でプログラムを書いていると、どうしたら期待通りに、かつ高速に動作するアルゴリズムが実装できるか、考えることがあります。 本記事では、アルゴリズムについて新たな視点を与えてくれる本「Algorithm Design with Haskell」を紹介します。

本記事はHaskell中級者向けです。Haskellの文法や、代表的なリスト操作関数を知っていることを前提としています。

  • はじめに
  • Algorithm Design with Haskellとは
  • 準備: 関数の同値関係
  • 貪欲アルゴリズムのPART紹介
    • 貪欲アルゴリズムとは
    • 候補の生成と選択
    • 貪欲アルゴリズムへの改善
  • まとめ
  • 採用情報
続きを読む

Haskellerのための量子プログラミングと線形依存型

2013年に量子コンピューティングのための関数型プログラミング言語Quipperが発表されました(Quipper: A Scalable Quantum Programming Language - arXiv、以下Quipperレポート)。QuipperはHaskell言語内のDSLとして作成された言語で、もともとは IARPA Quantum Computer Science (QCS) Programのなかで開発されたものであり、とてもよく考えられた言語です。Google Scholarでみても被引用数が444(2023年2月時点)あり、量子プログラミング言語のひとつの参照点になっているものだと思います。

ということで、今回はこのQuipperレポートをもとに量子プログラミングについてみていきたいと思います。

続きを読む