Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What is going on with this article?
@kirin123kirin

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

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

6
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
6
Help us understand the problem. What is going on with this article?