普通の.pyファイルの実行方法
Windows環境でのラッパーファイル作成方法を書く。
普通ならコマンドプロンプト等から実行する場合こうするはずだ。(python.exeのあるディレクトリのPATHが通ってる前提)
C:\Users\testuser> python C:\Users\testUser\pyruntest.py
→pyruntest.pyの実行結果が出る
しかし.pyファイルにpython.exeを関連付けされてなければ、こうはできない。
C:\Users\testuser> pyruntest.py
→エラー
1. batファイル or cmdファイルでラッパー作る
@echo off
%PYTHONPATH%\python.exe %~dp0\%~n0.py %*
例えばpyruntest.batというファイル名で上記を保存しておいたら
pyruntest.batと同じディレクトリにあるpyruntest.pyを次のように実行できる。
C:> pyruntest.bat
→pyruntest.pyの実行結果が出る
Pathを通しておけばどこからでも行ける
.batと打つのも面倒ならば拡張子を.cmdに変えればよい。
C:> pyruntest
→pyruntest.pyの実行結果が出る
2. C#でexeを作る。
1.の方法で大抵は問題ないのだが、処理させたい複数のファイルを引数として処理させるために
.cmdへドラッグアンドドロップさせたりしたときに割とこんなエラーが出る。
コマンドに指定したコマンドライン引数が多すぎます。正しい値を指定して、再度実行して下さい。
原因はcmd.exeの制限? 2047文字 or 8191文字(WinXP以降)が最大のようです。
powershellならこの上限はないのだが、.ps1をダブルクリックで実行させるには更にいばらの道。。
なんとお粗末なターミナルなのだろうか、、コマンドプロンプトだのPowershellなんてこの世から無くなってくれれば良いのにと思う。
exe化してしまえば解決できるはず。
そんな時に多分使える手段としてはもう、exe実行形式にするしかないだろう。
どうやってexe化するか色々手段があるのだが、
- pyInstallerやpy2exeで作る -> ファイルサイズがMB単位にバカデカいexeになってしまう。
- C言語で書く -> 開発環境構築が大変 eclipseやVisual Studioなんて入れたくない
- C# & csc -> Windows10からは標準でcsc.exeが入ってる
- JavaScript & jsc -> Windows10からは標準でjsc.exeが入ってる
結局Javascriptで作ろうと思ったが挫折、C#で作ることになった。
pyruntest.cs
C#初心者でよくわからないことが沢山あるがとりあえず動いたので晒す。
using System;
using System.Diagnostics;
using System.ComponentModel;
class Program
{
static void Main(string[] args)
{
// Python Program Path
var pythonScriptPath = System.Reflection.Assembly.GetExecutingAssembly().Location.Replace(".exe", "") + ".py";
try
{
var startInfo = new ProcessStartInfo()
{
FileName = @"python.exe",
UseShellExecute = false,
Arguments = "\"" + pythonScriptPath + "\" \"" + string.Join("\" \"", args),
};
using (var process = Process.Start(startInfo))
{
process.WaitForExit();
}
}
catch (Win32Exception)
{
Console.WriteLine("python.exeが見つかりませんでした。環境変数PATHに追加してください");
}
}
}
csc.exeでコンパイルするとpyruntest.exeができる
C:\Users\testuser> C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe pyruntest.cs
C:\Users\testuser> pyruntest.exe
→pyruntest.pyの実行結果が出る
C:\Users\testuser> pyruntest
→もちろんこれでもpyruntest.pyの実行結果が出る
ちゃんと環境変数パスを通してあげとけばカレントディレクトリ関係なく実行できる
C:\Users\testuser> set PATH=%PATH%;%CD%
C:\Users\testuser> setx PATH %PATH%
C:\Users\testuser> cd \
C:> pyruntest
→pyruntest.pyの実行結果が出る
方法1も方法2も共通の仕組みで、
上記実行方法共通的な仕様:[実行させたい].pyと同じディレクトリに[実行させたい].bat or [実行させたい].cmd or [実行させたい].exeを置く。(ラッパーのソースを毎回修正する必要はないようにした)
余談)なぜこんなことをしてるかというと自宅PCなら関連付け設定すれば終わりだが、
仕事用のシンクライアント環境だと権限がなく設定変更できなかったので、
こういった回りくどいラッパーが必要になってしまうのである。不便な世の中になってしまった。