나는 현재 이것을하고있다 :
PYTHONPATH=/home/$USER:/home/$USER/respository:/home/$USER/repository/python-stuff
PYTHONPATH가 모든 하위 디렉토리를 포함 할 수 있도록하려면 어떻게해야합니까?
PYTHONPATH = /home/$USER/....and-all-subdirectories
답변
이것이 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와 같은 동작은 없습니다 . 이와 관련하여 패키지에 대한 통역사의 지원을 고려할 때, 당신이 추구하는 것을 달성하는 더 좋은 방법이 반드시 있습니까?
답변
그것은 환경 PATH 변수가 작동하는 방식이 아닙니다. 최상위 디렉토리를 제공하고 필요한 경우 디렉토리 트리를 재귀하는 것은 응용 프로그램에 달려 있습니다.
답변
물론 쉘을 사용하여 디렉토리의 서브 디렉토리를 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 디렉토리에서만 수행해야합니다.