답변:
이것이 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와 같은 동작은 없습니다 . 이와 관련하여 패키지에 대한 통역사의 지원을 고려할 때, 당신이 추구하는 것을 달성하는 더 좋은 방법이 반드시 있습니까?
물론 쉘을 사용하여 디렉토리의 서브 디렉토리를 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 디렉토리에서만 수행해야합니다.