programing

다른 소스로 Python 검색 경로 확장

muds 2023. 7. 20. 22:13
반응형

다른 소스로 Python 검색 경로 확장

저는 방금 기존 코드 기반이 상당히 큰 프로젝트에 참여했습니다.우리는 리눅스에서 개발하고 및 IDE를 사용하지 않습니다.우리는 명령 줄을 통과합니다.프로젝트 모듈을 실행할 때 python이 올바른 경로를 검색하도록 하는 방법을 찾고 있습니다.예를 들어, 다음과 같은 작업을 실행할 때:

python someprojectfile.py

알겠습니다

ImportError: no module named core.'somemodule'

모든 수입품에 대해 이것을 받으니 경로에 문제가 있는 것 같습니다.

에서 파이썬을 ?~/codez/project/과 폴더를 저장합니다.*.py가져오기 명령문 중에 파일이 있습니까?

이 작업을 수행할 수 있는 몇 가지 방법이 있습니다.

  • 합니다.PYTHONPATH가져온 모듈을 검색하기 위해 콜론으로 구분된 디렉토리 목록으로 이동합니다.
  • 프로그램에서 다음을 사용합니다.sys.path.append('/path/to/search')Python에서 가져온 모듈을 검색할 디렉터리 이름을 추가합니다.sys.path Python이 모듈을 가져오라는 요청을 받을 때마다 검색하는 디렉터리 목록일 뿐이며, 필요에 따라 변경할 수 있습니다(단, 표준 디렉터리는 제거하는 것이 좋습니다!).환경 변수에 저장하는 모든 디렉터리PYTHONPATH는 에니다됩에 합니다.sys.pathPython이 시작될 때.
  • 디렉토리를 추가할 때 사용합니다.sys.path을 사용할 때입니다.addsitedir은 또한 은또찾습다니한그것다▁for니▁looks습을 찾습니다..pth하여 해당디리내파사추여용디추가수다있를니습가리할렉토하일을의렉에 할 수 .sys.path파일의 내용을 기준으로 합니다.자세한 내용은 설명서를 참조하십시오.

이 중 어느 것을 사용할지는 사용자의 상황에 따라 다릅니다.에게 프로젝트를 때Python의 "Python"에서됨).site-packages디렉토리), 그래서 만약 당신이 실수한다면.sys.path코드에서 이는 불필요할 수 있으며 코드가 다른 컴퓨터에서 실행될 때 악영향을 미칠 수도 있습니다.개발을 위해, 나는 감히 그 설정을 추측합니다.PYTHONPATH보통 가장 좋은 방법입니다.

그러나 자신의 컴퓨터에서만 실행되는 것을 사용할 때(또는 웹 앱 프레임워크 등에서 비표준 설정을 사용할 때) 다음과 같은 작업을 수행하는 것이 완전히 드문 일은 아닙니다.

import sys
from os.path import dirname
sys.path.append(dirname(__file__))

파이썬 패키지에 대해서도 여기에서 읽어보셔야 합니다. http://docs.python.org/tutorial/modules.html

당신의 예를 보면, 당신은 정말로 소포를 가지고 있다고 생각합니다.~/codez/project »__init__.pypython 디렉토리에서 디렉토리를 네임스페이스에 매핑합니다. "" " " " " "이 있는 __init__.py한 후 , 그다기디리만추됩니에 추가하기만 .PYTHONPATH예:

PYTHONPATH=$PYthonPATH:$HOME/adaifotis/project

David가 설명한 것처럼 PYONPATH 환경 변수를 테스트하는 것 외에도 다음과 같이 Python에서 테스트할 수 있습니다.

$ python
>>> import project                      # should work if PYTHONPATH set
>>> import sys
>>> for line in sys.path: print line    # print current python path

...

이 스레드가 조금 오래된 것은 알지만, 이 스레드의 핵심을 파악하는 데 시간이 좀 걸렸습니다. 그래서 저는 공유하고 싶었습니다.

제 프로젝트에서, 저는 부모 디렉토리에 메인 스크립트를 가지고 있었고, 모듈을 차별화하기 위해 모든 지원 모듈을 "modules"라는 하위 폴더에 넣었습니다.기본 스크립트에서 다음과 같은 모듈을 가져옵니다(report.py 이라는 모듈의 경우).

from modules.report import report, reportError

제가 메인 스크립트를 호출하면, 이것이 작동합니다.하지만, 저는 각 모듈을 테스트하기 위해 다음을 포함했습니다.main()각각에서, 그리고 다음과 같이 각각을 직접 호출합니다.

python modules/report.py

이제 Python은 "모듈이라고 불리는 모듈"을 찾을 수 없다고 불평합니다.여기서 핵심은 기본적으로 Python이 검색 경로에 스크립트의 폴더를 포함하지만 CWD는 포함하지 않는다는 것입니다.따라서 이 오류가 나타내는 것은 "모듈 하위 폴더를 찾을 수 없습니다."입니다.이는 report.py 모듈이 위치한 디렉토리에 "subdirectory" 하위 디렉토리가 없기 때문입니다.

이에 대한 가장 깔끔한 해결책은 Python 검색 경로에 CWD를 추가하는 것입니다. 위에 다음을 포함합니다.

import sys

sys.path.append(".")

이제 Python은 CWD(현재 디렉터리)를 검색하고 "모듈" 하위 폴더를 찾으며 모든 것이 정상입니다.

가장 입니다.any_name.pth그리고 그것을 당신의 폴더에 넣습니다.\Lib\site-packages파이썬이 설치된 곳이라면 어디서든 해당 폴더를 찾아야 합니다.

이 파일에 가져오기 위해 모듈을 보관할 디렉터리 목록을 넣습니다.예를 들어, 다음과 같이 파일에 줄을 만듭니다.

C:\Users\example\...\example

이것을 파이썬에서 실행하면 작동한다는 것을 알 수 있습니다.

import sys
for line in sys.path:
    print line

디렉토리가 인쇄된 것을 볼 수 있으며, 그 중에서도 가져올 수 있는 디렉토리가져올 수 있습니다.이제 다음을 가져올 수 있습니다.mymodule.py다음과 같이 쉽게 디렉터리에 저장할 수 있는 파일:

import mymodule

하위 폴더를 가져오지 않습니다.를 위해 하는 것을 해 볼 수 있습니다. 이를상수있습다니상할것을을 생성하는 할 수 ..pth정의한 폴더의 모든 하위 폴더를 포함하는 파일입니다.시작할 때 실행되도록 할 수도 있습니다.

저는 이 질문을 읽고 답을 찾았지만, 그 중 어느 것도 마음에 들지 않았습니다.

그래서 저는 빠르고 더러운 해결책을 썼습니다.이것을 당신의 sys.path 어딘가에 두면, 그것은 아래에 디렉토리를 추가할 것입니다.folder (으)로 설정된 (으)로 표시됨abspath:

#using.py

import sys, os.path

def all_from(folder='', abspath=None):
    """add all dirs under `folder` to sys.path if any .py files are found.
    Use an abspath if you'd rather do it that way.

    Uses the current working directory as the location of using.py. 
    Keep in mind that os.walk goes *all the way* down the directory tree.
    With that, try not to use this on something too close to '/'

    """
    add = set(sys.path)
    if abspath is None:
        cwd = os.path.abspath(os.path.curdir)
        abspath = os.path.join(cwd, folder)
    for root, dirs, files in os.walk(abspath):
        for f in files:
            if f[-3:] in '.py':
                add.add(root)
                break
    for i in add: sys.path.append(i)

>>> import using, sys, pprint
>>> using.all_from('py') #if in ~, /home/user/py/
>>> pprint.pprint(sys.path)
[
#that was easy
]

그리고 저는 몇몇 임의의 도구들을 위한 폴더를 만들 수 있고, 그것들을 패키지나 다른 어떤 것의 일부로 만들지 않고, 여전히 몇 줄의 코드로 그들 중 일부(또는 전부)에 액세스할 수 있기 때문에 그것을 좋아합니다.

첫 번째 작업은 현재 환경이 어디에서 표준 라이브러리를 얻었는지 알아내는 것입니다.여기서 OOP 모듈을 저장할 수 있습니다.

Import numpy

numpy.__file__

환경에 대한 카탈로그를 얻을 수 있습니다.다른 컴퓨터의 경우 OOP 모듈을 위한 별도의 디렉터리를 만드는 것이 좋습니다.

Import sys 

sys.path.append('F:/Python/My_libra/')

이전 질문에 대한 새로운 옵션입니다.
를 설치하는 입니다.fail2banDebian에./usr/lib/python3/dist-packages/fail2ban not python3 " 경로"sys.path.


> python3
Python 3.7.3 (v3.7.3:ef4ec6ed12, Jun 25 2019, 18:51:50)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/usr/lib/python3.7/site-packages']
>>>

그래서 저는 단순히 복사하는 대신 라이브러리를 최신 버전에 연결했습니다.
원본 앱에 대한 향후 업데이트는 링크된 버전에도 자동으로 적용됩니다.

 if [ -d /usr/lib/python3/dist-packages/fail2ban ]
   then
      for d in /usr/lib/python3.*
      do
         [ -d ${d}/fail2ban ] || \
            ln -vs /usr/lib/python3/dist-packages/fail2ban ${d}/
      done
   fi

언급URL : https://stackoverflow.com/questions/3144089/expand-python-search-path-to-other-source

반응형