pipx icon indicating copy to clipboard operation
pipx copied to clipboard

`pipx.util` circular import

Open adamjorr opened this issue 10 months ago • 2 comments

Importing from pipx.util fails due to circular dependency unless pipx.paths is imported first. It seems pipx.util became dependent on pipx.paths in #1281. pipx.paths then tries to import pipx_wrap from pipx.util and fails.

script to repro:

import pipx.util

if __name__ == "__main__":
    print("Success!")

Traceback (most recent call last):
  File "/Users/aorr1/Library/Application Support/JetBrains/PyCharm2023.3/scratches/scratch_19.py", line 1, in <module>
    import pipx.util
  File "/Users/aorr1/Library/Caches/pypoetry/virtualenvs/project-dJ3m09UH-py3.11/lib/python3.11/site-packages/pipx/util.py", line 24, in <module>
    from pipx import paths
  File "/Users/aorr1/Library/Caches/pypoetry/virtualenvs/project-dJ3m09UH-py3.11/lib/python3.11/site-packages/pipx/paths.py", line 10, in <module>
    from pipx.util import pipx_wrap
ImportError: cannot import name 'pipx_wrap' from partially initialized module 'pipx.util' (most likely due to a circular import) (/Users/aorr1/Library/Caches/pypoetry/virtualenvs/project-dJ3m09UH-py3.11/lib/python3.11/site-packages/pipx/util.py)

Expected behavior

import succeeds

adamjorr avatar Apr 08 '24 22:04 adamjorr

A circular import's not ideal, but removing it probably requires refactoring.

In the mean time, is this work around not suitable?

import pipx
import pipx.util

JamesParrott avatar Apr 09 '24 13:04 JamesParrott

I think import pipx still runs into the issue. import pipx.paths before import pipx.util does help.

adamjorr avatar Apr 09 '24 18:04 adamjorr