복붙노트

[PYTHON] 파이썬에서 코드 저장소로 작업 할 때 상대 경로를 참조하는 방법

PYTHON

파이썬에서 코드 저장소로 작업 할 때 상대 경로를 참조하는 방법

우리는 Windows와 Linux 모두에 배포되는 코드 저장소 (때로는 서로 다른 디렉토리에 있음)로 작업하고 있습니다. 프로젝트 내부의 모듈 중 하나가 프로젝트의 비 파이썬 리소스 (CSV 파일 등) 중 하나를 참조해야합니까?

우리가 다음과 같이하면 :

thefile=open('test.csv')

또는:

thefile=open('../somedirectory/test.csv')

스크립트가 특정 디렉토리 또는 디렉토리의 서브 세트에서 실행될 때만 작동합니다.

제가하고 싶은 것은 다음과 같습니다 :

path=getBasePathOfProject()+'/somedirectory/test.csv'
thefile=open(path)

이것이 올바른 방법일까요? 가능한가?

해결법

  1. ==============================

    1.현재 파일 경로를 기준으로 파일 이름을 사용하십시오. './my_file'의 예 :

    현재 파일 경로를 기준으로 파일 이름을 사용하십시오. './my_file'의 예 :

    fn = os.path.join(os.path.dirname(__file__), 'my_file')
    
  2. ==============================

    2.설정 도구를 사용하거나 배포 (setup.py 설치)하는 경우 이러한 패키지 된 자원에 액세스하는 "올바른"방법은 package_resources를 사용하는 것 같습니다.

    설정 도구를 사용하거나 배포 (setup.py 설치)하는 경우 이러한 패키지 된 자원에 액세스하는 "올바른"방법은 package_resources를 사용하는 것 같습니다.

    귀하의 경우에는 그 예가 될 것입니다.

    import pkg_resources
    my_data = pkg_resources.resource_string(__name__, "foo.dat")
    

    리소스와 읽기 바이너리 데이터를 읽는 것은 my_data의 값입니다.

    파일 이름 만 있으면 필요할 때 사용할 수 있습니다.

    resource_filename(package_or_requirement, resource_name)
    

    예:

    resource_filename("MyPackage","foo.dat")
    

    이점은 계란과 같은 아카이브 배포 물인 경우에도 작동하도록 보장된다는 것입니다.

    http://packages.python.org/distribute/pkg_resources.html#resourcemanager-api를 참조하십시오.

  3. ==============================

    3.나는 종종 이와 비슷한 것을 사용한다 :

    나는 종종 이와 비슷한 것을 사용한다 :

    import os
    DATA_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), 'datadir'))
    
    # if you have more paths to set, you might want to shorten this as
    here = lambda x: os.path.abspath(os.path.join(os.path.dirname(__file__), x))
    DATA_DIR = here('datadir') 
    
    pathjoin = os.path.join
    # ...
    # later in script
    for fn in os.listdir(DATA_DIR):
        f = open(pathjoin(DATA_DIR, fn))
        # ...
    

    변수

    __file__
    

    해당 코드를 작성하는 스크립트의 파일 이름을 보유하므로 스크립트에 상대적인 경로를 만들 수 있지만 절대 경로로 작성됩니다. 다음과 같은 이유로 잘 작동합니다.

    그러나 플랫폼 호환성을 고려해야합니다. Windows의 os.pathsep는 UNIX와 다릅니다.

  4. ==============================

    4.

    import os
    cwd = os.getcwd()
    path = os.path.join(cwd, "my_file")
    f = open(path)
    

    또한 os.path.abspath (os.getcwd ())를 사용하여 cwd를 정규화하려고 시도합니다. 더 많은 정보는 여기에 있습니다.

  5. ==============================

    5.파이썬에서 경로는 현재 작업 디렉토리에 상대적입니다. 대부분의 경우이 경로는 프로그램을 실행하는 디렉토리입니다. 현재 작업 디렉토리는 모듈 파일의 디렉토리와 같지 않을 수 있으므로 현재 모듈 파일과 관련된 경로를 사용하면 항상 잘못된 선택입니다.

    파이썬에서 경로는 현재 작업 디렉토리에 상대적입니다. 대부분의 경우이 경로는 프로그램을 실행하는 디렉토리입니다. 현재 작업 디렉토리는 모듈 파일의 디렉토리와 같지 않을 수 있으므로 현재 모듈 파일과 관련된 경로를 사용하면 항상 잘못된 선택입니다.

    절대 경로를 사용하는 것이 가장 좋은 해결책입니다.

    import os
    package_dir = os.path.dirname(os.path.abspath(__file__))
    thefile = os.path.join(package_dir,'test.cvs')
    
  6. ==============================

    6.__file__ 변수에서 빌드를 사용할 수 있습니다. 현재 파일의 경로를 포함합니다. 나는 프로젝트의 루트에있는 모듈에 getBaseOfProject를 구현할 것이다. 거기서 나는 __file__의 경로 부분을 얻을 것이고 그것을 반환 할 것입니다. 이 방법은 프로젝트의 모든 곳에서 사용할 수 있습니다.

    __file__ 변수에서 빌드를 사용할 수 있습니다. 현재 파일의 경로를 포함합니다. 나는 프로젝트의 루트에있는 모듈에 getBaseOfProject를 구현할 것이다. 거기서 나는 __file__의 경로 부분을 얻을 것이고 그것을 반환 할 것입니다. 이 방법은 프로젝트의 모든 곳에서 사용할 수 있습니다.

  7. ==============================

    7.나는이 문제에 대한 해답을 알아 내는데 오랜 시간을 보냈지 만 마침내 얻었습니다 (실제로는 실제로 간단합니다).

    나는이 문제에 대한 해답을 알아 내는데 오랜 시간을 보냈지 만 마침내 얻었습니다 (실제로는 실제로 간단합니다).

    import sys
    import os
    sys.path.append(os.getcwd() + '/your/subfolder/of/choice')
    
    # now import whatever other modules you want, both the standard ones,
    # as the ones supplied in your subfolders
    

    이렇게하면 파이썬이 볼 수있는 디렉토리에 하위 폴더의 상대 경로가 추가됩니다. 그것은 꽤 빠르며 더럽지 만 매력처럼 작동합니다 :)

  8. from https://stackoverflow.com/questions/1270951/how-to-refer-to-relative-paths-of-resources-when-working-with-a-code-repository by cc-by-sa and MIT license