2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Windowsでの.pyファイルの実行方法いろいろ

Last updated at Posted at 2020-10-17

普通の.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なら関連付け設定すれば終わりだが、
   仕事用のシンクライアント環境だと権限がなく設定変更できなかったので、
   こういった回りくどいラッパーが必要になってしまうのである。不便な世の中になってしまった。

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?