{"id":20500270,"url":"https://github.com/ohno/runningexternalprograms","last_synced_at":"2026-02-03T04:05:00.350Z","repository":{"id":156627792,"uuid":"401858955","full_name":"ohno/RunningExternalPrograms","owner":"ohno","description":"Running External Programs from The Julia Programming Language","archived":false,"fork":false,"pushed_at":"2021-09-02T22:30:59.000Z","size":49,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-21T22:02:41.891Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Fortran","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ohno.png","metadata":{"files":{"readme":"README.ipynb","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-08-31T22:24:49.000Z","updated_at":"2021-09-02T22:31:02.000Z","dependencies_parsed_at":null,"dependency_job_id":"d6fda96d-50b2-4a4a-beaf-fbb4e97e4dd9","html_url":"https://github.com/ohno/RunningExternalPrograms","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ohno/RunningExternalPrograms","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ohno%2FRunningExternalPrograms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ohno%2FRunningExternalPrograms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ohno%2FRunningExternalPrograms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ohno%2FRunningExternalPrograms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ohno","download_url":"https://codeload.github.com/ohno/RunningExternalPrograms/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ohno%2FRunningExternalPrograms/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29032018,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-03T02:28:16.591Z","status":"ssl_error","status_checked_at":"2026-02-03T02:27:48.904Z","response_time":96,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-15T18:20:21.151Z","updated_at":"2026-02-03T04:05:00.322Z","avatar_url":"https://github.com/ohno.png","language":"Fortran","funding_links":[],"categories":[],"sub_categories":[],"readme":"{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Juliaから外部プログラムを実行する\\n\",\n    \"\\n\",\n    \"© 2021 Shuhei Ohno\\n\",\n    \"\u003cbr\u003eLicense: https://opensource.org/licenses/MIT\\n\",\n    \"\u003cbr\u003eRepository: https://github.com/ohno/RunningExternalPrograms\\n\",\n    \"\\n\",\n    \"[Calling C and Fortran Code](https://docs.julialang.org/en/v1/manual/calling-c-and-fortran-code/)によると, JuliaではCやFortranのルーチンを`ccall`で呼び出せます. しかし, 共有ライブラリとしてコンパイルしないとけないので, 標準入力と標準出力でデータをやり取りするメインプログラムを呼び出すことは難しいように思われます. **元のプログラムには手を加えない**で, Julaiからプログラムを呼び出せるようにすることがこのノートのテーマです. CやFortranに限らず, 外部プログラムを呼び出す方法は[Running External Programs](https://docs.julialang.org/en/v1/manual/running-external-programs/)に概ね書いてありますが, サンプルが少なく, Windows環境だといろいろ引っかかるポイントがあるので補足説明していきます. 環境は以下の通りです.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Julia Version 1.6.2\\n\",\n      \"Commit 1b93d53fc4 (2021-07-14 15:36 UTC)\\n\",\n      \"Platform Info:\\n\",\n      \"  OS: Windows (x86_64-w64-mingw32)\\n\",\n      \"  CPU: Intel(R) Core(TM) i7-4650U CPU @ 1.70GHz\\n\",\n      \"  WORD_SIZE: 64\\n\",\n      \"  LIBM: libopenlibm\\n\",\n      \"  LLVM: libLLVM-11.0.1 (ORCJIT, haswell)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"versioninfo()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Hello World!\\n\",\n    \"\\n\",\n    \"さっそくですがHello World!していきましょう. 戻り値が不要な(標準出力で良い)場合は`run()`, 結果を受け取りたい場合は`read()`か`readchomp()`です. なお, コマンドを囲むのはバッククォートです. \\n\",\n    \"\\n\",\n    \"\u003cstrong\u003eこれはWindowsでは動きません\u003c/strong\u003e\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"run(`echo hello`)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"read(`echo hello`, String)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"readchomp(`echo hello`)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"\u003cstrong\u003eWindowsでのechoはこっち！\u003c/strong\u003e\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"hello\\r\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Process(`\\u001b[4mcmd\\u001b[24m \\u001b[4m/C\\u001b[24m \\u001b[4mecho\\u001b[24m \\u001b[4mhello\\u001b[24m`, ProcessExited(0))\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"run(`cmd /C echo hello`)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"\\\"hello\\\\r\\\\n\\\"\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"read(`cmd /C echo hello`, String)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"\\\"hello\\\"\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"readchomp(`cmd /C echo hello`)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"型はそれぞれ以下のようになります. 出力に`hello`が挟まりますが気にしないでください.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"1. Cmd\\n\",\n      \"hello\\n\",\n      \"2. Base.Process\\n\",\n      \"3. String\\n\",\n      \"4. SubString{String}\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"println(\\\"1. \\\", typeof(`cmd /C echo hello`))\\n\",\n    \"println(\\\"2. \\\", typeof(run(`cmd /C echo hello`)))\\n\",\n    \"println(\\\"3. \\\", typeof(read(`cmd /C echo hello`, String)))\\n\",\n    \"println(\\\"4. \\\", typeof(readchomp(`cmd /C echo hello`)))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"メモ帳`notepad.exe`などのプログラムを呼び出すこともできます.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Process(`\\u001b[4mnotepad\\u001b[24m`, ProcessExited(0))\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"run(`notepad`)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Process(`\\u001b[4mnotepad.exe\\u001b[24m`, ProcessExited(0))\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"run(`notepad.exe`)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Process(`\\u001b[4mnotepad.exe\\u001b[24m \\u001b[4mprogram1.f90\\u001b[24m`, ProcessExited(0))\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"run(`notepad.exe program1.f90`)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## 標準出力のみ\\n\",\n    \"\\n\",\n    \"Hello World!と同じですが, 一応確認しましょう. 次の`program1.f90`は4という数値を標準出力に返すだけのプログラムです. コンパイルして生成された`program1.exe`を呼び出して標準出力の動作を確認していきます. (ファイルは[リポジトリ](https://github.com/ohno/RunningExternalPrograms)にあります. `gfortran`がインストールされてパスが通っていれば`compile.bat`をクリックすると勝手にコンパイルされます.)\\n\",\n    \"\\n\",\n    \"`program1.f90`\\n\",\n    \"```fortran\\n\",\n    \"program main\\n\",\n    \"  write(6,*) 4\\n\",\n    \"end program main\\n\",\n    \"```\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"           4\\r\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"run(`program1`);\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"           4\\r\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"run(`program1.exe`);\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"           4\\r\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Process(`\\u001b[4mcmd\\u001b[24m \\u001b[4m/C\\u001b[24m \\u001b[4mprogram1.exe\\u001b[24m`, ProcessExited(0))\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"run(`cmd /C program1.exe`)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"\\\"           4\\\\r\\\\n\\\"\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"read(`program1.exe`, String)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"\\\"           4\\\"\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"readchomp(`program1.exe`)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## 標準入力から変数を１つ渡す\\n\",\n    \"\\n\",\n    \"次の`program2.f90`は標準入力をread文で読み取り, 数値を2乗して標準出力に返すプログラムです. コンパイルして生成された`program2.exe`を呼び出して動作を確認していきます. (ファイルは[リポジトリ](https://github.com/ohno/RunningExternalPrograms)にあります. `gfortran`がインストールされてパスが通っていれば`compile.bat`をクリックすると勝手にコンパイルされます.)\\n\",\n    \"\\n\",\n    \"`program2.f90`\\n\",\n    \"```fortran\\n\",\n    \"program main\\n\",\n    \"  implicit none\\n\",\n    \"  integer x\\n\",\n    \"  read(5,*) x\\n\",\n    \"  write(6,*) x**2\\n\",\n    \"end program main\\n\",\n    \"```\\n\",\n    \"`input2.txt`\\n\",\n    \"```\\n\",\n    \"5\\n\",\n    \"```\\n\",\n    \"\\n\",\n    \"まず, コマンドラインから`\u003c`によって標準入力を渡せますが, `\u003c`は`'\u003c'`のようにシングルクォーテーションで囲います.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"          25\\r\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Process(`\\u001b[4mcmd\\u001b[24m \\u001b[4m/C\\u001b[24m \\u001b[4mprogram2.exe\\u001b[24m \\u001b[4m'\u003c'\\u001b[24m \\u001b[4minput2.txt\\u001b[24m`, ProcessExited(0))\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"run(`cmd /C program2.exe '\u003c' input2.txt`)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"コマンドプロンプトを経由せずに実行するには`pipeline()`を使います. 引数`stdin`にファイル名やコマンドを与えることができます. ファイル名の時はダブルクォーテーション, コマンドはバッククォートなので気を付けてください.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"          25\\r\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Process(`\\u001b[4mprogram2.exe\\u001b[24m`, ProcessExited(0))\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"run(pipeline(`program2.exe`, stdin=\\\"input2.txt\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"          36\\r\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Base.ProcessChain(Base.Process[Process(`\\u001b[4mcmd\\u001b[24m \\u001b[4m/C\\u001b[24m \\u001b[4mecho\\u001b[24m \\u001b[4m6\\u001b[24m`, ProcessExited(0)), Process(`\\u001b[4mprogram2.exe\\u001b[24m`, ProcessExited(0))], Base.DevNull(), Base.DevNull(), Base.DevNull())\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"run(pipeline(`program2.exe`, stdin=`cmd /C echo 6`))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"以下のように`open`文で標準入力を渡すこともできます. 恐らく, 結果を受け取れないようなので`run`でよいと思います. 強いて言うなら, `open`と`end`の間で`for`文を回したり, `write`, `print`,`println`などが使い分けられるなどのメリットがあります.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"          49\\r\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"open(`program2.exe`, \\\"w\\\", stdout) do io\\n\",\n    \"   println(io, 7)\\n\",\n    \"end\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"          49\\r\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"io = open(`program2.exe`, \\\"w\\\", stdout)\\n\",\n    \"println(io, 7)\\n\",\n    \"close(io)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## 標準入力から変数を２つ渡す\\n\",\n    \"\\n\",\n    \"次の`program3.f90`は標準入力をread文で読み取り, 2つの数値の和を取って標準出力に返すプログラムです. 基本的には先ほどの例と同じですが, Fortran側のプログラムが2つの数値を読み取れるようになっています. コンパイルして生成された`program3.exe`を呼び出して動作を確認していきます. (ファイルは[リポジトリ](https://github.com/ohno/RunningExternalPrograms)にあります. `gfortran`がインストールされてパスが通っていれば`compile.bat`をクリックすると勝手にコンパイルされます.)\\n\",\n    \"\\n\",\n    \"`program3.f90`\\n\",\n    \"```fortran\\n\",\n    \"program main\\n\",\n    \"  implicit none\\n\",\n    \"  double precision x, y\\n\",\n    \"  read(5,*) x, y\\n\",\n    \"  write(6,*) x + y\\n\",\n    \"end program main\\n\",\n    \"```\\n\",\n    \"`input2.txt`\\n\",\n    \"```\\n\",\n    \"5\\n\",\n    \"6\\n\",\n    \"```\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"   11.000000000000000     \\r\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Process(`\\u001b[4mprogram3.exe\\u001b[24m`, ProcessExited(0))\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"run(pipeline(`program3.exe`, stdin=\\\"input3.txt\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"   12.000000000000000     \\r\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Base.ProcessChain(Base.Process[Process(`\\u001b[4mcmd\\u001b[24m \\u001b[4m/C\\u001b[24m \\u001b[4mecho\\u001b[24m \\u001b[4m5\\u001b[24m \\u001b[4m7\\u001b[24m`, ProcessExited(0)), Process(`\\u001b[4mprogram3.exe\\u001b[24m`, ProcessExited(0))], Base.DevNull(), Base.DevNull(), Base.DevNull())\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"run(pipeline(`program3.exe`, stdin=`cmd /C echo 5 7`))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"   13.000000000000000     \\r\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"open(`program3.exe`, \\\"w\\\", stdout) do io\\n\",\n    \"   println(io, \\\"5 8\\\")\\n\",\n    \"end\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"   14.000000000000000     \\r\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"input = \\\"5\\n\",\n    \"9\\\"\\n\",\n    \"\\n\",\n    \"open(`program3.exe`, \\\"w\\\", stdout) do io\\n\",\n    \"   println(io, input)\\n\",\n    \"end\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"   15.000000000000000     \\r\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"open(`program3.exe`, \\\"w\\\", stdout) do io\\n\",\n    \"   println(io, 5)\\n\",\n    \"   println(io, 10)\\n\",\n    \"end\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"配列として渡したい場合には以下のように対処します.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"   16.000000000000000     \\r\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Base.ProcessChain(Base.Process[Process(`\\u001b[4mcmd\\u001b[24m \\u001b[4m/C\\u001b[24m \\u001b[4mecho\\u001b[24m \\u001b[4m5\\u001b[24m \\u001b[4m11\\u001b[24m`, ProcessExited(0)), Process(`\\u001b[4mprogram3.exe\\u001b[24m`, ProcessExited(0))], Base.DevNull(), Base.DevNull(), Base.DevNull())\"\n      ]\n     },\n     \"execution_count\": 24,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"input = [5,11]\\n\",\n    \"run(pipeline(`program3.exe`, stdin=`cmd /C echo $input`))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"   17.000000000000000     \\r\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"input = [5,12]\\n\",\n    \"open(`program3.exe`, \\\"w\\\", stdout) do io\\n\",\n    \"    for x in input\\n\",\n    \"        println(io, x)\\n\",\n    \"    end\\n\",\n    \"end\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## 外部プログラムを関数として扱う\\n\",\n    \"\\n\",\n    \"先ほどの`program3.exe`を例に解説します. このプログラムを関数として扱うには, 戻り値が必要なので`read()`か`readchomp()`を利用します. これらの結果は文字列なので, さらに`parse()`を使って数値に型変換します.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"f (generic function with 1 method)\"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"f(X) = parse(Float64,readchomp(pipeline(`program3.exe`, stdin=`cmd /C echo $X`)))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"18.0\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"y = f([5,13])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## 外部プログラムのパラメータ最適化\\n\",\n    \"\\n\",\n    \"ここでは[Optim.jl](https://github.com/JuliaNLSolvers/Optim.jl)を利用します. 事前に[パッケージモード](https://qiita.com/skiing_LAL10/items/0c0132a34629fbc8a91f)で`add Optim`を実行してインストールし, ノート上では`using Optim`を宣言しておく必要があります. まず, [Rosenbrock関数](https://en.wikipedia.org/wiki/Rosenbrock_function)を最小化する例を見てみましょう.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# using Pkg\\n\",\n    \"# Pkg.add(\\\"Optim\\\")\\n\",\n    \"using Optim\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[0.9999634355313174, 0.9999315506115275]\\n\",\n      \"3.5255270584829996e-9\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"rosenbrock_julia(x) = (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2\\n\",\n    \"x0 = [0.0, 0.0]\\n\",\n    \"opt = optimize(rosenbrock_julia, x0)\\n\",\n    \"\\n\",\n    \"println(Optim.minimizer(opt))\\n\",\n    \"println(Optim.minimum(opt))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"次の`program4.f90`は標準入力から変数$x,y$を受け取ってRosenbrock関数の値を標準出力に返す例です. このプログラムをコンパイルした`program4.exe`をJuliaの関数としての扱い, $x,y$を最適化します.\\n\",\n    \"\\n\",\n    \"`program4.f90`\\n\",\n    \"```fortran\\n\",\n    \"program main\\n\",\n    \"  implicit none\\n\",\n    \"  double precision x, y\\n\",\n    \"  read(5,*) x, y\\n\",\n    \"  write(6,*) 100.*(x*x-y)**2+(1.-x)**2\\n\",\n    \"end program main\\n\",\n    \"```\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[0.9999634355313174, 0.9999315506115275]\\n\",\n      \"3.5255270584829996e-9\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"rosenbrock_fortran(x) = parse(Float64,readchomp(pipeline(`program4.exe`, stdin=`cmd /C echo $x`)))\\n\",\n    \"x0 = [0.0, 0.0]\\n\",\n    \"opt = optimize(rosenbrock_fortran, x0)\\n\",\n    \"\\n\",\n    \"println(Optim.minimizer(opt))\\n\",\n    \"println(Optim.minimum(opt))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Juliaだけの例と, Fortranと連携した例で全く同じ結果が得られました.\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Julia 1.6.2\",\n   \"language\": \"julia\",\n   \"name\": \"julia-1.6\"\n  },\n  \"language_info\": {\n   \"file_extension\": \".jl\",\n   \"mimetype\": \"application/julia\",\n   \"name\": \"julia\",\n   \"version\": \"1.6.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fohno%2Frunningexternalprograms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fohno%2Frunningexternalprograms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fohno%2Frunningexternalprograms/lists"}