PYTHONPATH 환경 변수… 나중에 모든 하위 디렉토리를 만들려면 어떻게해야합니까?


9

나는 현재 이것을하고있다 :

PYTHONPATH=/home/$USER:/home/$USER/respository:/home/$USER/repository/python-stuff

PYTHONPATH가 모든 하위 디렉토리를 포함 할 수 있도록하려면 어떻게해야합니까?

PYTHONPATH = /home/$USER/....and-all-subdirectories

답변:


14

이것이 PYTHONPATH의 작동 방식이 아닙니다. PYTHONPATH는 검색 경로를 쉘 PATH와 다르게 취급합니다. 내가 이것을한다고 가정 해 봅시다.

$ mkdir /home/jsmith/python
$ cd /home/jsmith/python
$ touch a.py b.py

이것은 파이썬에서 작동 sys.path합니다 (현재 디렉토리를 포함합니다) :

$ cd /
$ PYTHONPATH=/home/jsmith/python python2.6

Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51)
>>> import a, b   # Works
>>> quit()

그러나 서브 디렉토리는 디렉토리에있을 때 패키지로 취급되며 __init__.py, 그렇지 않으면 PYTHONPATH에 의해 무시 됩니다.

$ mkdir /home/jsmith/python/pkg
$ cd /home/jsmith/python/pkg
$ touch __init__.py c.py d.py
$ cd /
$ PYTHONPATH=/home/jsmith/python python2.6

Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51)
>>> import a, b   # Works
>>> import c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named c

해당 하위 디렉토리에서 무언가를 얻으려면 다음과 같이하십시오.

>>> from pkg import c   # Works
>>> import pkg.c        # Works

PYTHONPATH의 모든 서브 디렉토리가 추가 된 솔루션을 롤하려면 PYTHONPATH에 모든 폴더를 명시 적으로 또는 sys.path프로그래밍 방식 으로 추가해야합니다 . 이 동작은 의도적이며 쉘 PATH와 같은 동작은 없습니다 . 이와 관련하여 패키지에 대한 통역사의 지원을 고려할 때, 당신이 추구하는 것을 달성하는 더 좋은 방법이 반드시 있습니까?


3
Man, 나는 당신이 권한을 게시하기 전에 각 사이트가 다른 계정을 확인하기를 바랍니다. 그것은 특히 한 URL 제한 같은 것들과, 담당자로부터 다시 안됐다 ... (나는 당신을 위해 더 참고, OP했다)
제드 스미스

1

그것은 환경 PATH 변수가 작동하는 방식이 아닙니다. 최상위 디렉토리를 제공하고 필요한 경우 디렉토리 트리를 재귀하는 것은 응용 프로그램에 달려 있습니다.


따라서 /home/$USER/myfile.py 아래에 python 파일이 있으면 가져올 수 있습니까?
Alex

물론, 왜 못 했어요?
EEAA

1

물론 쉘을 사용하여 디렉토리의 서브 디렉토리를 PYTHONPATH 변수에 추가 할 수 있습니다. 나는 현재 내 .bashrc에서 다음과 비슷한 것을 사용합니다.

export PYTHONPATH="$(find $HOME/ -maxdepth 2 -type d | sed '/\/\./d' | tr '\n' ':' | sed 's/:$//')"

트리에서 깊이 2까지의 사용자 폴더의 모든 하위 디렉토리가 포함됩니다. find 명령은 디렉토리 ( '-type d')를 찾고 다음 sed 및 tr 명령은 일반적인 PATH 변수 방식으로 출력 형식을 지정합니다.

'-maxdepth 2'를 생략하면 홈 폴더의 모든 하위 디렉토리가 포함되므로 검색해야 할 것이 많습니다. 아마도 이것은 $ HOME / repository / python-stuff 디렉토리에서만 수행해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.