Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

AssertionError when attempting to locate dotenv file #499

Open
HonakerM opened this issue Jan 23, 2024 · 4 comments
Open

AssertionError when attempting to locate dotenv file #499

HonakerM opened this issue Jan 23, 2024 · 4 comments

Comments

@HonakerM
Copy link

Hello,

I updated to the latest python-dotenv version (1.0.1) this morning and am now starting to see the following Assertion Errors:

Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
<>
  File "/usr/local/lib/python3.11/site-packages/dotenv/main.py", line 305, in find_dotenv
    assert frame.f_back is not None
           ^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError

The code that generated the above looks like the following:

if path := find_dotenv(raise_error_if_not_found=False):
  load_dotenv()

Please let me know if there are any other logs or data I can provide to help the debugging/investigation process

@Bajron
Copy link

Bajron commented Jan 27, 2024

Took a look at this one.

I think we can change the assertion into breaking the loop. I checked the history and it seems the assertion is there to make static analysis happy. Traced it back to this one eb3eab8

If I understand the code correctly, this variable is None when we are the the top of the call stack. If we break the loop at that point we get reasonable guess for the path to start the lookup.

To be honest, I could not reproduce the issue with "typical" code.

I suspect introducing or not os.path.exists(frame.f_code.co_filename) caused the problem.
With this assumption I could reproduce it in the following way on Ubuntu.

Create a test.py with the following content:

#!/usr/bin/env python3
import dotenv
import os

os.unlink('test2.py')

if path := dotenv.find_dotenv(raise_error_if_not_found=False):
    print(path)
else:
    print("no path")

Create a symbolic link with ln -s test.py test2.py

Run python test2.py

Now I guess this is not your use case @HonakerM , so could you share a little more details about your scenario?
How is the script called, what is your environment, and especially, does it involve scripts moving/deleting/any other operations that can make the code think the source file does not exist?

@Bajron
Copy link

Bajron commented Jan 30, 2024

Added a PR with my suggestion. I think we still need to understand what actually happens in your environment though.
You can test it with:
pip install python-dotenv@git+https://github.com/Bajron/python-dotenv@assertion-find-dotenv-for-upstream

You might need to uninstall the old version first as the version string is still the same and pip might not apply the changes because of that.

@theskumar
Copy link
Owner

@HonakerM Would it possible for you test the fix by @Bajron and/or report more about your environment?

@HonakerM
Copy link
Author

HonakerM commented Feb 3, 2024

@theskumar sorry for the delay I will try out the fix this weekend

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants