こんばんは、社畜です。
以前以下の記事の中で、Pythonで簡単にドラッグアンドドロップを実装する方法として、
バッチファイルを使う方法を紹介しました。
本日は、より深堀してドラッグアンドドロップを完全攻略していきたいと思います。
よろしくお願いいたします。
ドラッグアンドドロップの流れの整理(絶対パス)

基本以前の記事の通り、下記の流れは変わりません
バッチファイルにドラッグアンドドロップして → Pythonに引数で渡す
バッチファイルとPythonをうまく連携させながら、作っていきます。
バッチファイルの書き方を確認する
バッチファイルからPythonへのファイルパスの渡し方として2つのパターンありますので、
それぞれ確認していきましょう。
Python側は下記コードを記載しました。引数(sys.argv)で受け取ったものを表示するだけのシンプルなコードです
# -*- coding: utf-8 -*-
import sys
print("Python start")
file_paths = sys.argv[1:]
for path in file_paths:
print("File path [===>] "+path)
print("Python end")
1. ファイル別にpythonを起動/終了し、常に第一引数として渡す方法
1つ目の方法では、各ファイルごとにPythonを起動/終了して実行するため、
人間が1つ1つ実行するときと同じ感覚で使用できると思います。
純粋に人間の作業をバッチファイルが代わりに実行してくれているので、わかりやすく私は断然こちら派です。
for %%i in (%*) do (
python.exe xxx.py %%i
)

2. pythonの起動/終了は1回で、引数の「数」として増やしていく方法
2つ目の方法は、Pythonを一度実行したらファイルパスの中身の処理が全部終わるまで終了しません。
Pythonの起動/終了の回数が少ない分、実行時間としては早くなりますね。
ただ、大量データとかになってくるとさすがにメモリ開放とかちゃんとやらないと、
処理が落ちます。玄人向けな実装かなぁという印象です。
python xxx.py %*
pause

絶対パスの取得は上記で完璧に使いこなすことができるようになりましたね。
とりあえず悩んだら、1. ファイル別にpythonを起動/終了し、常に第一引数として渡す方法を
使えばOKだと思います。
相対パスをどうやって取り出すか

状況によってはドラッグアンドドロップしたファイルの相対パスを取得したい場合もあると思うので
検討してみました。
結論 : os.pathを使うことで簡単に解決
os.path.relpathの関数を使えば一撃で解決できました。
>>os.path.relpath(ファイルのパス, 基準となるパス)
取得した絶対パスに基準となるパスを追加するだけで実現できます。
※【Python】絶対パス・相対パスの取得方法(os.pathモジュール)様を参考にさせていただきました
Pythonのコードをこんな感じで書き換えてみました。
# -*- coding: utf-8 -*-
import sys
import os
print("Python start")
file_paths = sys.argv[1:]
for path in file_paths:
print(" File path [===>] "+path)
path = os.path.relpath(path, "D:/") #(ファイルのパス, 基準となるパス)
print("Rel File path [===>] "+path)
print("Python end")

簡単に狙い通り相対パスが取り出せましたね!
注意点としては、作っているpythonスクリプトに対して、「別のフォルダにあるファイル」を
ドラッグアンドドロップすると、コマンドプロンプトがそのファイルのパスで起動してしまいます。
ですので、バッチファイルは下記のように書き換えましょう。
for %%i in (%*) do (
python.exe "絶対パス/xxx.py" %%i
)
Pythonスクリプトは””で囲み、絶対パスで記載することをオススメしたい
やはりプログラミングは適材適所。
バッチファイルもうまく使いこなすことで、Pythonがさらに輝きますね!
では、今回は以上になります。
質問はTwitterから受け付けていますので、お気軽にどうぞ
>>pythonで生き延びる社畜(@coin_python) | Twitter
ラジオ放送でもエンジニアについて熱く語っています。こちらもお楽しみください
>>社畜戦士のエンジニアを熱く語るラジオ | stand.fm
案件などでユーザーに使ってもらいやすいPythonスクリプトを提供するときには、
今回のようなドラッグアンドドロップのような使いやすさも大切ですし、
さらには、「プログラムの保証の仕方」も非常に大切になります。
下記記事では、プログラムの検証方法についても解説していますので、
これから案件をやっていく方や企業でプログラムを書く方に有益な情報となると思いますので
よかったらこちらもご閲覧ください。