[python] Python : 현재 실행중인 스크립트를 기준으로 sys.path에 추가하는 가장 좋은 방법

스크립트로 가득 찬 디렉토리가 있습니다 (예 🙂 project/bin. 또한 라이브러리가 있으며 project/lib스크립트가 자동으로로드하기를 원합니다. 이것은 내가 일반적으로 각 스크립트의 상단에서 사용하는 것입니다.

#!/usr/bin/python
from os.path import dirname, realpath, sep, pardir
import sys
sys.path.append(dirname(realpath(__file__)) + sep + pardir + sep + "lib")

# ... now the real code
import mylib

이것은 번거롭고 추악하며 모든 파일의 시작 부분에 붙여 넣어야합니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

정말로 내가 바라는 것은 다음과 같이 부드러운 것입니다.

#!/usr/bin/python
import sys.path
from os.path import pardir, sep
sys.path.append_relative(pardir + sep + "lib")

import mylib

또는 더 좋은 것은 내 편집자 (또는 커밋 액세스 권한이있는 다른 사람)가 정리 프로세스의 일부로 가져 오기 순서를 변경하기로 결정할 때 깨지지 않는 것입니다.

#!/usr/bin/python --relpath_append ../lib
import mylib

그것은 non-posix 플랫폼으로 직접 이식되지는 않지만 모든 것을 깨끗하게 유지합니다.



답변

각 파일을 편집하고 싶지 않은 경우

  • 일반 파이썬 libray처럼 라이브러리를 설치
    하거나
  • 설정 PYTHONPATHlib

또는 각 파일에 한 줄을 추가하려면 맨 위에 import 문을 추가하십시오.

import import_my_lib

import_my_lib.pybin에 보관 하고 원하는 import_my_lib대로 파이썬 경로를 올바르게 설정할 수 lib있습니다.


답변

이것이 내가 사용하는 것입니다.

import os, sys
sys.path.append(os.path.join(os.path.dirname(__file__), "lib"))


답변

나는 사용하고있다 :

import sys,os
sys.path.append(os.getcwd())


답변

다음을 포함하는 래퍼 모듈을 만듭니다 project/bin/lib.

import sys, os

sys.path.insert(0, os.path.join(
    os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib'))

import mylib

del sys.path[0], sys, os

그런 다음 스크립트 상단의 모든 흠집을 다음으로 바꿀 수 있습니다.

#!/usr/bin/python
from lib import mylib


답변

어떤 방식 으로든 스크립트 내용을 변경하지 않으려면 현재 작업 디렉토리 .를 $ PYTHONPATH 앞에 추가 하십시오 (아래 예제 참조).

PYTHONPATH=.:$PYTHONPATH alembic revision --autogenerate -m "First revision"

그리고 그것을 하루라고!


답변

파이썬 3.4
이상 사용하기 cx_freeze 사용 금지 또는 IDLE 사용. 😃

import sys
from pathlib import Path

sys.path.append(Path(__file__).parent / "lib")


답변

python -m관련 루트 디렉토리에서 스크립트를 실행할 수 있습니다 . 그리고 “모듈 경로”를 인수로 전달하십시오.

예: $ python -m module.sub_module.main # Notice there is no '.py' at the end.


다른 예시:

$ tree  # Given this file structure
.
├── bar
   ├── __init__.py
   └── mod.py
└── foo
    ├── __init__.py
    └── main.py

$ cat foo/main.py
from bar.mod import print1
print1()

$ cat bar/mod.py
def print1():
    print('In bar/mod.py')

$ python foo/main.py  # This gives an error
Traceback (most recent call last):
  File "foo/main.py", line 1, in <module>
    from bar.mod import print1
ImportError: No module named bar.mod

$ python -m foo.main  # But this succeeds
In bar/mod.py