python-dotenv icon indicating copy to clipboard operation
python-dotenv copied to clipboard

AssertionError when attempting to locate dotenv file

Open HonakerM opened this issue 1 year ago • 4 comments

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

HonakerM avatar Jan 23 '24 21:01 HonakerM

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 https://github.com/theskumar/python-dotenv/commit/eb3eab86bc14ef0ed511f8545833e4da6cee721a

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 avatar Jan 27 '24 15:01 Bajron

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.

Bajron avatar Jan 30 '24 10:01 Bajron

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

theskumar avatar Feb 03 '24 15:02 theskumar

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

HonakerM avatar Feb 03 '24 16:02 HonakerM