質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

6219閲覧

Popenでコンソールが立ち上がる

sky6720

総合スコア19

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2019/07/30 23:48

編集2019/07/31 02:43

pythonから共有ネットワーク上にある各種エクセルやpdf、エクスプローラを開こうとしています。
2つ質問があります。

subprocess.Popenでexcelファイルを開く際に、excelが起動せずにコンソールが立ち上がるだけのものもあります。
コンソールのタイトル画面には開きたいファイルのフルパスが表示されており、別コンソールでそのパスを入力し実行すると正常にファイルが起動します。

コンソールが立ち上がってしまうものはファイル形式等になにか問題があるのでしょうか。
例えばexcelファイルにおいて、同じ.xlsの拡張子を持つファイルでもコンソールが開くときと正常に開くときの2種類に分かれています。
各ファイルは同じように作成しているので形式等に差異はないかと思うのですが、
subprocess.Popenでコンソールが開く要因はなにかあるのでしょうか。

なお、開くためのコマンドは

python

1subprocess.Popen([‘start’, file_fullpath], shell = True)

で行なっています。

追記:
下記のように、['start', ~]の部分をなくしてファイルパスのみにすれば正常起動しました。

python

1subprocess.Popen(file_fullpath, shell = True)

'start'はどのような処理がしたいときに使用するものでしょうか。

②また、できればファイルを開くコマンドとエクスプローラを開くコマンドを1行で済ませたいと思っております。

python

1#エクスプローラ 2subprocess.Popen('explorer', folder_fullpath) 3#ファイル 4subprocess.Popen([‘start’, file_fullpath], shell = True)

現在はos.path.isfile(fullpath)でディレクトリかファイル化を判断してこのように2行に分けて実行しています。
なにか別の方法がありましたらご教授ください。
2行に分けて書けば問題ないのですが、私の知らないもっと簡単に実現できる方法があればご教授願いたい次第です。

質問ばかりで申し訳ありませんがよろしくお願いいたします。

nekozombie👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2019/07/31 02:18

1について、パスの違いやファイル内容の違いがこちらには何も伝わってこないので、何の判断もできないと思います。少なくとも一つずつ程度の例を上げて質問されてはいかがでしょうか。 2について、2行に分けてはいけないのは何故ですか?
sky6720

2019/07/31 02:44

修正依頼ありがとうございます。 内容編集いたしましたのでお手数ですがご確認お願いいたします。
guest

回答1

0

ベストアンサー

1: パス名に空白等が含まれ、自動的に"で囲まれる場合ですね。

startコマンドはオペランドが1つで、それが"で囲まれている場合、それを「ウィンドウタイトル」と見なし、コマンドプロンプトを開きます。start /?参照。

なので、subprocess.Popen(['start', '', file_fullpath], shell = True)と、
第一オペランドに空文字列、または空白を含んだ文字列を指定します。

オペランドが2つ以上の場合でも、第一オペランドが"で囲まれていた場合はウィンドウタイトルなのですが、第二オペランド以降でGUIアプリが起動する場合は、無視されます。コンソールアプリが起動する場合はコマンドプロンプトの中でそのコンソールアプリが動くわけですが、そのときのコマンドプロンプトのウィンドウタイトルになります。
例:`subprocess.Popen(['start', 'foo bar', 'timeout', '10'], shell = True)

2:
subprocess.Popen(['start', '', file_or_folder_fullpath], shell = True)
で良いと思います。

投稿2019/07/31 04:56

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sky6720

2019/07/31 05:59

ご回答ありがとうございました! やりたかったことが実現できました。 Popenはコマンドプロンプト経由で実行されてその引数が問題だったのですね。 ありがとうございました。
otn

2019/07/31 06:09

shell=Trueにしなければコマンドプロンプト経由じゃないですが、その場合は「ファイル名だけの指定で拡張子に関連付いたアプリが起動」という機能は使えないと思います。 Excelなら、["Excel.exeのフルパス", "foo.xlsxのフルパス"] みたいなexeの指定が必要。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問