mawarumarimo
@mawarumarimo (まる まる)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

pythonで指定したファイルを既定のプログラムで開きたい

解決したいこと

PHPからファイルのディレクトリ、フォルダ名の文字列をpythonへ送ったのですが、python側で該当ファイルを開きたいです。

PHP

<?php
$arg1 = $data['image']['file_name'];
$arg2 = "C:\\xampp\\htdocs\\imagePosting\\images\\";
$command = "python exp.py " . escapeshellarg($arg1) . " " . escapeshellarg($arg2);
$output = array();
$return_var = 0;
exec($command, $output, $return_var);
echo implode("\n", $output);
?>

phpからディレクトリ情報とファイル名を送っています。
スクリーンショット 2023-12-03 234749.png

pythonで二つの値が読み取れていることは確認済みです。

PYTHON

import tkinter as tk
import os
import subprocess
import sys

def my_function(arg1, arg2):
    root = tk.Tk()
    root.title("arg1, arg2の値")
    root.geometry("300x100")
    label1 = tk.Label(root, text=f"arg1: {arg1}")
    label1.pack()
    label2 = tk.Label(root, text=f"arg2: {arg2}")
    label2.pack()
    root.mainloop()

if __name__ == "__main__":
    my_function(sys.argv[1], sys.argv[2])
    dir_path = os.path.join(r"arg2","arg1")
    older_name = os.path.basename(os.path.normpath(dir_path))
    subprocess.Popen(['start', r'dir_path'], shell=True)
    # subprocess.Popen(f'explorer "{os.path.abspath(dir_path)}"')

しかし、このコードを実行してもwindows通知音?がするのみで、ファイルが開かれません。以下のサイトを参考に、既定のプログラムで画像ファイルが開かれるようにしたいです。

参考文献
・【Python】エクスプローラーの起動:指定したフォルダ・ファイルを開く(subprocessモジュール)https://office54.net/python/app/subprocess-explorer-folder

試したこと

✖dir_path に直接url指定は失敗。

 dir_path = os.path.join(r"C:\xampp\htdocs\imagePosting\images\PHP.drawio.png")
     older_name = os.path.basename(os.path.normpath(dir_path))
    subprocess.Popen(['start', r'dir_path'], shell=True)

    path = r"arg2" + "arg1"
    subprocess.Popen(['start◯', path], shell=True)

◯URLに直接url指定はうまく開きました。

 subprocess.Popen(['start', r'C:\xampp\htdocs\imagePosting\images\PHP.drawio.png'], shell=True)

arg2,arg1の値を使用して開くように修正したいです。どなたかお力添えいただけますと幸いです。

0

1Answer

こう?

- subprocess.Popen(['start', r'dir_path'], shell=True)
+ subprocess.Popen(['start', dir_path], shell=True)
0Like

Comments

  1. @mawarumarimo

    Questioner

    ありがとうございます。rがいらなかったのですね。
    arg2,1をカンマでつなげていた場所も+にしてみました。

    
    if __name__ == "__main__":
        my_function(sys.argv[1], sys.argv[2])
        dir_path = os.path.join(r'"arg2" + "arg1"')   
        subprocess.Popen(['start', dir_path], shell=True)
        # subprocess.Popen(f'explorer "{os.path.abspath(dir_path)}"')
    

    前回はフォルダにかかわらずエクスプローラーのドキュメントフォルダが開かれていましたが、今度はコマンドプロントが起動しエクスプローラーが起動しなくなりました。またコマンドプロントを見るとarg2の値はわたっているようですが、ファイル名までは指定されていない?ようです

    スクリーンショット 2023-12-04 124128.png

  2. エクスプローラーのドキュメントフォルダが開かれていました

    これはexplorerコマンドの結果によるものだと思われますが,現状コメントアウトしてるから開かないものだと思われます.

    コマンドプロントを見るとarg2の値はわたっているようですが、ファイル名までは指定されていない?

    これはstart "arg2" + "arg1"というコマンドが実行された結果でしかなく,C:\xampp\htdocs\imagePosting\htmlフォルダ配下で開かれるのはそこにプログラムがあるなどのコード外の要因ですね.

    コマンドプロンプトのタイトルに"arg2" + "arg1"と書かれてしまっていることから分かるように,subprocess.Popenで渡す値をずっと間違えています.

    最初は文字列dir_pathを渡しており,今回は文字列"arg2" + "arg1"を渡しています.そうではなく,変数arg2arg1を結合した文字列を渡したいのでしょう

    if __name__ == "__main__":
        my_function(sys.argv[1], sys.argv[2])
    -   dir_path = os.path.join(r'"arg2" + "arg1"')
    +   dir_path = os.path.join(arg2, arg1)
        subprocess.Popen(['start', dir_path], shell=True)
        subprocess.Popen(f'explorer "{os.path.abspath(dir_path)}"')
    

    こう書くべきではないですか?

Your answer might help someone💌