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

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

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

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

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

0回答

1360閲覧

Rust:dotenv::from_pathで設定ファイルを認識してくれない

m_osa

総合スコア4

Windows 10

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

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2021/12/30 16:23

前提・実現したいこと

Rustのdotenvで任意のconfigファイルを読み込むことができるようにすることで、
設定を切り替えたいと思っております。

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

該当のソースコードに記載したものは、ネット検索した例を基にしておりますが、 なぜかファイルの読み込み結果が”None”になってしまいます。 設定ファイルを認識してくれない原因をお教えいただけると幸いです。 ・エラーメッセージ thread 'main' panicked at 'VAR is not defined: NotPresent', src\main.rs:26:31 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

該当のソースコード

Rust

1use dotenv; 2use std::env; 3use std::path::PathBuf; 4 5fn main() -> std::io::Result<()> { 6 7 // Config File Read 8 // 環境変数読み込み 9 let result: Vec<(String, String)> = dotenv::vars().collect(); 10 println!("{:?}", result); 11 // 特定の設定ファイル読み込み 12 let my_path = PathBuf::from(r"C:\Users****\test.env"); 13 let res = dotenv::from_path(my_path.as_path()).ok(); 14 println!("{:?}", res); // ここでの結果が”None” 15 let var = env::var("VAR").expect("VAR is not defined"); // ここでエラー 16 println!("{}", var); 17 18 Ok(()) 19} 20 21

試したこと

以下のコードの「********」部分を、相対パスに変えてみたり、
test.envの中身を変えてみたりしたのですが、結果が変わりませんでした。

let res = dotenv::from_path(********).ok();

補足情報(FW/ツールのバージョンなど)

・Windows10
・rustc 1.57.0

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

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

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

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

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

equal-l2

2021/12/31 00:10

`dotenv::from_path`はResultを返すので、まずはそのエラーを確認してはどうですか?
m_osa

2021/12/31 00:48

こちらの質問にもご回答いただき、ありがとうございます! コードを以下のように変更して確認してみたところ、以下のような結果になっておりました。 度々申し訳ないのですが、dotenv::from_pathを通すと、なぜ違うディレクトリを認識して しまうのでしょうか? ・println!の出力結果 最初のprintln! ⇒ "test1 C:/Users/*****/test.env" 次のprintln! ⇒ "test2 Err(LineParse("C:\\Users\\*****\\Downloads", 3))" ・ソースコード let my_path = PathBuf::from(r"C:/Users/*****/test.env"); println!("test1 {:?}", my_path); let res = dotenv::from_path(&my_path); println!("test2 {:?}", res);
equal-l2

2021/12/31 00:54

途中のパスがわからないとなんとも言えないですね
m_osa

2021/12/31 03:55

分かり辛くて申し訳ありません。 PathBuf::fromに記載のパスを変更してみました。(が、結果は変わらずでした。) ※以下の{ユーザ名}はアルファベット小文字で5文字になります(abcdeのような) ・println!の出力結果 最初のprintln! ⇒ "test1 C:/Users/test.env" 次のprintln! ⇒ "test2 Err(LineParse("C:\\Users\\{ユーザ名}\\Downloads", 3))" ・ソースコード let my_path = PathBuf::from("C:/Users/test.env"); println!("test1 {:?}", &my_path); let res = dotenv::from_path(&my_path); println!("test2 {:?}", res);
equal-l2

2021/12/31 04:12 編集

dotenvのソースを詳しく読んでみました LineParseの第一要素は「読み込めなかった行の内容」のようなので、test.env の中身が表示されているはずです .envファイルは「名前=要素」の形式になっていないといけないのですが、そのようになっていますか?
equal-l2

2021/12/31 04:14

脇道ですが、teratailは一問一答形式のサイトなので、このように複数の問題が絡む場合にはあまり向いていません もしよろしければ、日本のrustコミュニティのSlackがありますので、そちらへの参加をご検討ください。 https://rust-jp.rs/
m_osa

2021/12/31 05:35

ご回答いただき、ありがとうございます! 「名前=要素」の形式になっていたのですが、test.envの中身の記載内容を 「C:\Users\{ユーザ名}\Downloads」⇒「C:/Users/{ユーザ名}/Downloads」 に変更したところ、読み込むことができるようになりました。 また、rustコミュニティをご紹介いただきありがとうございます! 参加させていただこうと思います。
emergent

2022/01/08 16:43

ここでやりとりされているのに気づかず、自分のWindows上のRust環境で動作させてみましたが、「該当のソースコード」の****を自分のユーザー名に変え、該当パスにtest.envを配置するだけで動作しました。 不思議ですね。ひょっとして、ユーザー名部分に空白が含まれていたりしますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問