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

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

新規登録して質問してみよう
ただいま回答率
85.30%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Python

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

Q&A

解決済

3回答

1433閲覧

Python.exeによるスクリプトへのPATH制御が効かない。

zamatec

総合スコア1

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Python

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

0グッド

1クリップ

投稿2023/06/21 12:51

実現したいこと

・タイムスケジューラのアプリ(C#言語による)を制作して、指定時刻にPythonスクリプトを実行したく、これをアプリから起動したい。

前提

・現在、Windowsのタイムスケジューラで指定時刻にPython言語のPythonスクリプトを起動して、プログラムを実行しています。これをWindowsのタイムスケジューラに頼らないC#言語によるアプリに置き換えたい。
・ドライブはCとDがあり、CドライブにWindows10システムが入っており、Python言語もここのユーザーフォルダに入っている。
・PATH設定は、環境変数設定でpython.exeについては行っている。

発生している問題・エラーメッセージ

・DOS窓での具体的な実行コマンドは「C:\Users\member>python.exe d:\program\code\main.py」です。
これは、実行できているタイムスケジューラで登録しているコマンドと同じ。
実行の経緯は、Pythonが起動しスクリプトmain.pyが実行されます。
プログラムの途中で一つ上のディレクトリ\programの位置に置いたエクセルファイル「parameter.xlsx」を読みに行くのですが、これが認識できずにエラー停止します。

DOS窓のカレントをDドライブにしてフォルダをスクリプトが置いてあるD:¥program\code にして「python.exe main.py」で実行すると、1つ上の階層にあるparameter.xlsxを読みエラーとなりません。
推理するのは、
python自身が、アプリケーション(main.py)のある位置を認識できていないため。その上のフォルダを探せないのでは?
と思うのですが、その対策が解りません。
pythonプログラムそのものをイジれば良いのでしょうが、それでは独立性に欠けるのでその方法はとりたくありません。

エラーメッセージ ```「FileNotFoundError: [Errno 2] No such file or directory: '../parameter.xlsx'」 ### 該当のソースコード

ソースコード

### 試したこと ### 補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

jbpb0

2023/06/21 14:23

> DOS窓のカレントをDドライブにしてフォルダをスクリプトが置いてあるD:¥program\code にして「python.exe main.py」で実行すると、1つ上の階層にあるparameter.xlsxを読みエラーとなりません。 https://qiita.com/moisutsu/items/46c7b29b1f68a83f6ec8 に書かれてる方法で、「main.py」がある「d:\program\code」をカレントディレクトリにできると思います
guest

回答3

0

ベストアンサー

python自身が、アプリケーション(main.py)のある位置を認識できていないため。その上のフォルダを探せないのでは?と思うのですが、その対策が解りません。

Pythonスクリプトに対して相対的な場所のファイルを扱いたい場合は、
os.chdir(os.path.dirname(__file__))したり、
cur_dir = os.path.dirname(__file__)して、os.path.join(cur_dir,"~~~")したりするのが普通です。

pythonプログラムそのものをイジれば良いのでしょうが、それでは独立性に欠けるのでその方法はとりたくありません。

「独立性に欠ける」という意図がわかりませんが、「Pythonスクリプトに対して相対的な場所のファイルを扱いたい」ではないと言うことでしょうか?
「Pythonスクリプトの場所に関係なく特定の場所(d:\program??)のファイルを扱いたい」ということなら、プログラム中に絶対パスを書くか、引数あるいは環境変数等でファイル名もしくはディレクトリ名を与えます。

投稿2023/06/21 15:31

otn

総合スコア86316

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

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

zamatec

2023/06/22 00:08

返答が遅れてすみません。質問を出してひと段落して寝ちゃいました。 対象のpythonスクリプトは、完成品扱いで私にはいじれない状況です。なので、「独立性に欠ける」などと言い訳をしましたが、そういう理由で外部で工夫!というわけです。 ご指摘の 「os.chdir(os.path.dirname(__file__))したり、 cur_dir = os.path.dirname(__file__)して、os.path.join(cur_dir,"~~~")」は、pythonの頭部の容易と思われるであろう処置ですが、採用したくないのです。 なにせ、Windowsのタスクスケジューラによる起動ではうまく実行しているので、同様に扱えないのが「しゃく」です。
otn

2023/06/22 04:10 編集

「独立性に欠ける」という表現では「中身を修正できない」は読み取れないです。まったく意味が違うので。 ・プログラムを修正できない ・プログラム中で相対パス記述あり であれば、「起動前にカレントディレクトリを変更してから起動」しか手がないので、 外側にバッチファイルその他で一皮かぶせるくらいでしょうか。 (一皮は、バッチでもいいしPowershellでもいいしPythonとかで書いてもいい) バッチファイルを使うのが実行するのが簡単です。 cd /d D:¥program\code python.exe main.py (ドライブをまたぐcd は /d が必要ですが、私は cd /d の代わりに pushd を書くことが多いです)
zamatec

2023/06/22 07:13

出来ました!! ありがとうございます。 DOS窓操作を1つ1つコマンドレベルで行うことを、バッチにすれば良かっただけでした。 他の方からも指摘されていたのですが、ここまで言い含められないと気が付かないとは。 年のせいかなあ?頭が固くなってきてます。 皆さんにも、対応いただき感謝です。
guest

0

cd してから実行ではどうですか。

cd d:\program\code C:\Users\member>python.exe d:\program\code\main.py

投稿2023/06/22 00:54

68user

総合スコア2048

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

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

zamatec

2023/06/22 01:37

回答ありがとうございます。 早速試しましたが、不調でした。 同じエラー内容で終わります。 Pythonスクリプト実行中に、python.exeをカレントとせず、自分の位置をPythonスクリプト位置をカレントとして維持できていれば良さそうなのですが・・・
TakaiY

2023/06/22 02:02

横から失礼します。 その結果はおかしいです。質問の内容とも合いません。 > DOS窓のカレントをDドライブにしてフォルダをスクリプトが置いてあるD:¥program\code にして「python.exe main.py」で実行すると、1つ上の階層にあるparameter.xlsxを読みエラーとなりません。
zamatec

2023/06/22 07:29

回答ありがとうございました。 おかげで解決しました。 本来は、最初のご指摘でクリアできればよかったのですが、ここまで掛かってしまいました。 ありがとうございました。
otn

2023/06/22 15:00 編集

> > 同じエラー内容で終わります。 > その結果はおかしいです。質問の内容とも合いません。 Windowsは、ドライブ毎にカレントディレクトリーを管理しています。それと別にカレントドライブを管理しています。 /d オプションを付けない cd コマンドはカレントドライブを変更しません。 カレントドライブがCドライブの状態で、cd D:\~~ しても「Dドライブのカレントディレクトリ」が変更されるだけで、カレントドライブはCドライブのままなので、「(ドライブ込みの)カレントディレクトリー」も「Cドライブのカレントディレクトリー」のままです。 このあと、D: と入力してカレントドライブを変更するか、最初から /d オプションを付けて cd /d D:\~~ するかです。 なので、カレントドライブがC:の状態でこのバッチファイルを実行すると、cd しないのと同じ結果です。
guest

0

実行中のプログラムは、そのプロセスの相対パスの起点となる「カレントパス」を持っています。

そのカレントパスは、プログラムファイルの置いてある場所とは関係なく、通常はそのスクリプトを実行した場所となります。

DOS窓のカレンをDドライブにしてフォルダをスクリプトが置いてあるD:¥program\code にして「python.exe main.py」で実行すると

なので、この場合は、カレントパスは、 そのスクリプトを実行したDOS窓のパスになります。

カレントパスは、通常は実行時のパスであり、実行する場所によって変わるものですから、プログラム内の「相対パス」で書かれかファイルなどは、想定したカレントパスでない場合、質問のようにアクセスできなくなります。

対策としては、

  • パスを絶対パスで指定する
  • カレントパスを想定した場所に移動する
  • パスを環境変数などから取得する

あたりでしょう。


追記

対象のpythonスクリプトは、完成品扱いで私にはいじれない

であって、さらに実行するパスを変えたいということであれば、他の方の回答にもありますが、実行前にパスを移しておけばいいでしょう。
pythonスクリプトを実行するための bat やPowerShellスクリプトを作ってそれを実行するようにすればいいと思います。

投稿2023/06/21 14:30

編集2023/06/22 01:38
TakaiY

総合スコア14396

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

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

zamatec

2023/06/21 23:58

返答が遅れてすみません。質問を出してひと段落して寝ちゃいました。 対象のpythonスクリプトは、完成品扱いで私にはいじれない状況です。なので、外部で工夫!というわけです。 ですから、 pythonスクリプト内で「../parameter.xlsx」とされ、相対PATHで設定されており、「・パスを絶対パスで指定する」策は不可能なのです。 ご指摘の通り「・カレントパスを想定した場所に移動する」の対策が必然だと思い、pythonスクリプトの位置を指定して、このmain.pyは実行していますが、その中の相対PATHでの移動ができていません? 「パスを環境変数などから取得する」については、対処しているつもりですが未熟のため不全なのかもしれません。(Windowsのタスクスケジューラによる起動では、うまく実行するので・・・)
TakaiY

2023/06/22 01:49

回答に追記しました。 > 完成品扱いで私にはいじれない状況 条件があるのであれば、質問に含めておいていただけると遠回りせずに済んだと思います。 > pythonスクリプトの位置を指定して、このmain.pyは実行 実行するスクリプトのパスを指定しても、カレントパスは変りません。 > 「パスを環境変数などから取得する」については、対処しているつもり 僕の書き方がわるかったかもしれません。通常の環境変数のパス(PATH)はコマンド検索のパスで、今回の質問とは関係ありません。 pythonから環境変数を読むことができるので、あらかじめ今回のパスを別の任意の環境変数に入れておきスクリプトから読んでカレントパスに設定するばいいという趣旨でした。
zamatec

2023/06/22 07:22

横からもコメントいただきありがとうございました。 ご指摘通り、質問時で述べたように、順次コマンドでエラーは出していませんでした。 それをバッチファイル化すればよいだけでした。 結果的には下らないミスでした。皆さんにお付き合いいただき感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問