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

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

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

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

1回答

210閲覧

Pythonの相対パスについての内部挙動について質問です

holmirr707

総合スコア10

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2024/11/01 02:12

編集2024/11/01 03:00

質問内容
1.pythonで相対パスを記載した際に、どのディレクトリを基準として解決するのか
2.モジュールをimportする際にどのディレクトリを基準とするのか

1.について
例えば、ディレクトリ構造が
/project/src/main.py
/project/chromedriver/chromedriver.exe
のmain.pyでdriver_path = "./chromedriver/chromedriver.exe"として、seleniumを動かします。
作業ディレクトリを/projectの状態でpython ./src/main.pyを起動すると、カレントディレクトリ=作業ディレクトリを基準にしてchromedriverのpathが認識されるのはわかります。
しかし、cd /project/srcを行ったのち、python main.pyを実行してもchromedriverのpathが認識されてしまいます。
pythonの内部ではどのように相対パスを解釈しているのでしょうか?

Python

1from selenium import webdriver 2from selenium.webdriver.chrome.service import Service 3import os 4import time 5 6driver_path = "./chromedriver/chromedriver.exe" 7service = Service(excutable_path = driver_path) 8driver = webdriver.Chrome(service=service) 9 10print(f"カレントディレクトリは{os.getcwd()}") 11driver.get("https://www.google.com/") 12time.sleep(5) 13driver.quit()

2.について
/project/src/main.py
/project/src/module.py
main.pyからimport moduleをしたい場合についてです。
作業ディレクトリをprojectの状態でpython ./src/main.pyを実行してもimoprtは成功します。
importにおいてのモジュールパスの認識はmain.pyからの相対パスであってカレントディレクトリは関係ないということですか?

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

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

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

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

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

maisumakun

2024/11/01 02:19

調べてみたことなどはありますか? (検索してヒットしなかった場合も、どのようなキーワードで検索したかご提示いただけるとありがたいです)
holmirr707

2024/11/01 02:29

1.にいついて chromedriver 相対パスやpython相対パスについても調べましたが、カレントディレクトリと__name__ == "__main__"の.pyファイルを置いてあるディレクトリの違いについて深く言及しているサイトは見つけられなかったです。 2.については__name__ == "__main__"の.pyファイルからimportする際には、その.pyファイルの親ディレクトリがsys.pathに自動で追加されるという記述がありましたが、ではカレントディレクトリはどうなのかという記述は見つけられなかったです。
quickquip

2024/11/01 02:37 編集

> のmain.pyでdriver_path = "./chromedriver/chromedriver.exe"として、seleniumを動かします。 だとどんなコードを実行しているか伝わってません。 driver_path の指定が **実際は機能していない** 可能性は考慮/テストしていますか?
holmirr707

2024/11/01 03:01

すみません コードを追加させていただきました。 上記コードで機能はしています。
melian

2024/11/01 05:56 編集

"excutable_path" となっていますが、これは "executable_path" でしょう。("e" が抜けています ex"e"cutable_path) service = Service(excutable_path = driver_path) => service = Service(executable_path = driver_path) "executable_path = driver_path" に修正すると、「cd /project/srcを行ったのち、python main.pyを実行」する場合はエラーになるはずです。(selenium.common.exceptions.NoSuchDriverException が発生)
holmirr707

2024/11/01 10:23

ご指摘ありがとうございます。 確かに、間違った引数のままだと、chromedriver.exeを削除しても動作しました。 そして、executable_pathと正しく引数を指定すると、カレントディレクトリからの相対パスでしか動作しなくなりました。 Seleniumバージョン4.6以上だと、手動でchromedriver.exeをダウンロードする必要はなく、driver = webdriver.Chrome()だけで動作するようですね。 非常にすっきりしました。ありがとうございました。
guest

回答1

0

1.pythonで相対パスを記載した際に、どのディレクトリを基準として解決するのか

ご認識の通り、起動時のディレクトリです。
なので、質問の内容の通りであれば、/project/src ディレクトリに移動した後には driver_path は不正なパスになるはずです。

相対パスはカレントディレクトリが基準になっていますので、スクリプトに

python

1import pathlib 2print(pathlib.Path.cwd())

のような記述を入れてカレントディレクトリを確認してみるとなにかわかるかもしれません。

2.モジュールをimportする際にどのディレクトリを基準とするのか

モジュールのインポート先は、カレントディレクトリとは関係ありません。

https://docs.python.org/ja/3.12/library/sys_path_init.html

ここにあるようにモジュールは検索パスのリストから探索され、最初のエントリは起動されたスクリプトのある場所です。それ以降はPYTHONPATH などに設定されているパスが追加されるなどしますが、カレントディレクトリは含まれません。

投稿2024/11/01 02:39

TakaiY

総合スコア13687

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

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

holmirr707

2024/11/01 10:26

回答ありがとうございます。 相対パスとimportについて非常にわかりやすかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問