현재 스크립트 디렉토리를 올바르게 판별하려면 어떻게 해야 합니까?
Python에서 현재 스크립트 디렉토리를 결정하는 가장 좋은 방법이 무엇인지 알고 싶습니다.
Python 코드를 호출하는 방법은 다양하기 때문에 좋은 솔루션을 찾기 어렵다는 것을 알게 되었습니다.
몇 가지 문제가 있습니다.
__file__가 "Detail"로 되지 않습니다.exec,execfile__module__되어 있습니다.
사용 사례:
./myfile.pypython myfile.py./somedir/myfile.pypython somedir/myfile.pyexecfile('myfile.py')(다른 스크립트로부터, 다른 디렉토리에 배치할 수 있고, 다른 현재의 디렉토리를 가질 수 있습니다.
완벽한 해결책은 없다는 것을 알지만, 대부분의 사례를 해결할 수 있는 최선의 방법을 찾고 있습니다.
많이 은 "" 입니다.os.path.dirname(os.path.abspath(__file__)) 이 을 다른 하다 보면 안 돼요.exec().
경고
현재 디렉토리를 사용하는 솔루션은 모두 실패합니다.이는 스크립트의 호출 방법에 따라 다르거나 실행 중인 스크립트 내에서 변경할 수 있습니다.
os.path.dirname(os.path.abspath(__file__))
정말 최고가 될 것 같아요.
않은 일입니다.exec/execfile; 보통 모듈인프라스트럭처를 사용하여 스크립트를 로드합니다.꼭 해야 한다면, 저는 설정하기, 설정하기, 설정하기, 설정하기, 설정하기, 설정하기, 설정하기, 설정하기, 설정하기 을 추천합니다.__file__ globals스크립트에 전달하면, 그 파일명을 읽을 수 있습니다.
실행 코드로 파일명을 취득하는 다른 방법은 없습니다.CWD는 전혀 다른 장소에 있을 수 있습니다.
를 통해 execfile(...) 을할 수 .inspectmodule module module module module 、 [ module ]제가 아는 한, 이 방법은 귀하가 열거한 모든 경우에 적용됩니다.
filename = inspect.getframeinfo(inspect.currentframe()).filename
path = os.path.dirname(os.path.abspath(filename))
Python 3.4+에서는 보다 간단한 모듈을 사용할 수 있습니다.
from inspect import currentframe, getframeinfo
from pathlib import Path
filename = getframeinfo(currentframe()).filename
parent = Path(filename).resolve().parent
이 경우에도 하실 수 있습니다.__file__한 경우)는 (사용 가능한 경우)를 피하기 inspect「이것들」은 다음과 같습니다.
from pathlib import Path
parent = Path(__file__).resolve().parent
#!/usr/bin/env python
import inspect
import os
import sys
def get_script_dir(follow_symlinks=True):
if getattr(sys, 'frozen', False): # py2exe, PyInstaller, cx_Freeze
path = os.path.abspath(sys.executable)
else:
path = inspect.getabsfile(get_script_dir)
if follow_symlinks:
path = os.path.realpath(path)
return os.path.dirname(path)
print(get_script_dir())
CPython, Jython, Pypy 。.execfile() )sys.argv[0] ★★★★★★★★★★★★★★★★★」__file__-기반솔루션은여기서실패합니다).스크립트가 실행 가능한 zip 파일(/에그) 안에 있는 경우 작동합니다.스크립트가 「import」되어 있는 경우( )가져 있습니다.PYTHONPATH=/path/to/library.zip python -mscript_to_runzip ([zip (zip)])을 클릭합니다. 이 경우 아카이브 경로를 반환합니다.가 스탠드아론 파일 아론 실행 파일」)로 되어 , 합니다.sys.frozen심볼링크)에서 realpath는 심볼릭링크를 배제합니다.인터프리터로 동작합니다.이 경우 현재 작업 디렉토리를 반환합니다.
os.path...파이썬 2 '파이썬 2'입니다.
Python 3에서는 다음과 같이 스크립트 디렉토리를 찾을 수 있습니다.
from pathlib import Path
script_path = Path(__file__).parent
그럴 것이다
import os
cwd = os.getcwd()
하고 싶은 거 해?"현재 스크립트 디렉토리"가 정확히 무엇을 의미하는지 잘 모르겠습니다.당신이 제시한 사용 사례에 대한 예상 출력은 어떻게 됩니까?
쓰세요.os.path.dirname(os.path.abspath(__file__)) 꼭 .exec 모듈로 할 수 일 수 .스크립트를 모듈로 사용할 수 없는 경우 설계에 문제가 있을 수 있습니다.
Python #8의 Zen을 기억해 두시기 바랍니다. 그리고 만약 여러분이 이것이 효과가 있어야 하는 사용 사례에 대한 좋은 주장이 있다고 믿는다면exec그럼 문제의 배경에 대해 좀 더 자세히 알려주세요.
주의: 이 답변은 패키지입니다.
https://github.com/heetbeet/locate
$ pip install locate
$ python
>>> from locate import this_dir
>>> print(this_dir())
C:/Users/simon
★★★의 .py"CHANGE: "CHANGE:
스크립트의 디렉토리(옆에 저장된 파일에 액세스하기 위해)를 자주 사용하지만 디버깅을 위해 인터랙티브셸에서 이러한 스크립트를 실행하는 경우도 자주 있습니다.하겠습니다.this_dir같이요.
- 「 Import 」를 하는
.py" " " " " " 파일.이것은 항상 올바른 경로입니다. - 「」를 경우
.ipyn현재 작업 디렉토리인 노트북.는 작업 를 "Directory"로 에 이 는 항상 입니다. 주피터.ipynb기본 디렉토리. - REP에서 실행 중인 경우 현재 작업 디렉토리입니다.흠, 파일에서 코드가 분리되었을 때 실제 "올바른 경로"는 무엇입니까?REP를 기동하기 전에, 「올바른 패스」로 변경하는 것이 고객의 책임입니다.
Python 3.4 이상:
from pathlib import Path
this_dir = Path(globals().get("__file__", "./_")).absolute().parent
Python 2 이상:
import os
this_dir = os.path.dirname(os.path.abspath(globals().get("__file__", "./_")))
설명:
globals()는 모든 글로벌 변수를 사전으로 반환합니다..get("__file__", "./_")합니다."__file__"globals()「」를 되돌립니다."./_".- 부분은 그냥 됩니다.
__file__(오류)"./_"경로로 경로의 디렉토리를 를 절대 파일 경로로 변환한 다음 파일 경로의 기본 디렉토리를 반환합니다.
첫째, 익명의 코드를 주입하는 방법에 대해 얘기한다면 여기 몇 개의 유스케이스가 누락되어 있습니다.
code.compile_command()
code.interact()
imp.load_compiled()
imp.load_dynamic()
imp.load_module()
__builtin__.compile()
loading C compiled shared objects? example: _socket?)
하지만 진짜 질문은, 당신의 목표는 무엇인가? 어떤 종류의 보안을 강화하려는 것인가 하는 것입니다.아니면 무엇이 로딩되어 있는지 궁금하신 건가요?
보안에 관심이 있는 경우 exec/exec 파일을 통해 Import되는 파일 이름은 중요하지 않습니다.다음 기능을 제공하는 rexec을 사용해야 합니다.
이 모듈에는 r_eval(), r_execfile(), r_exec() 및 r_import() 메서드를 지원하는 Rexec 클래스가 포함되어 있습니다.이 메서드는 표준 Python 함수 eval(), execfile() 및 exec 및 Import 문의 제한된 버전입니다.이 제한된 환경에서 실행되는 코드는 안전하다고 간주되는 모듈 및 기능에만 액세스할 수 있습니다.필요에 따라 RExec 기능을 서브클래스로 추가 또는 삭제할 수 있습니다.
하지만, 만약 이것이 더 학문적인 추구라면..여기 당신이 좀 더 깊이 파고들 수 있는 몇 가지 바보 같은 접근법이 있다.
스크립트 예시:
./deep.py
print ' >> level 1'
execfile('deeper.py')
print ' << level 1'
./filength.화이
print '\t >> level 2'
exec("import sys; sys.path.append('/tmp'); import deepest")
print '\t << level 2'
/tmp/syslog.화이
print '\t\t >> level 3'
print '\t\t\t I can see the earths core.'
print '\t\t << level 3'
./pypy.화이
import sys, os
def overseer(frame, event, arg):
print "loaded(%s)" % os.path.abspath(frame.f_code.co_filename)
sys.settrace(overseer)
execfile("deep.py")
sys.exit(0)
산출량
loaded(/Users/synthesizerpatel/deep.py)
>> level 1
loaded(/Users/synthesizerpatel/deeper.py)
>> level 2
loaded(/Users/synthesizerpatel/<string>)
loaded(/tmp/deepest.py)
>> level 3
I can see the earths core.
<< level 3
<< level 2
<< level 1
물론, 이것은 자원을 많이 사용하는 방법입니다.모든 코드를 추적하게 됩니다.별로 효율적이지 않다.하지만 둥지에 더 깊이 들어가도 계속 효과가 있기 때문에 참신한 접근이라고 생각합니다.eval'은 덮어쓸 수 없습니다.execfile()을 덮어쓸 수 있습니다.
이 접근법은 exec/exec 파일만을 대상으로 하며, 'import'는 대상으로 하지 않습니다.상위 레벨의 '모듈' 로드 후크에서는 sys.path_hooks(PyMOTW에서 쓰기 제공)를 사용할 수 있습니다.
그게 내가 당장 할 수 있는 전부야.
여기 부분적인 해결책이 있습니다.지금까지 발표된 모든 솔루션보다 훨씬 낫습니다.
import sys, os, os.path, inspect
#os.chdir("..")
if '__file__' not in locals():
__file__ = inspect.getframeinfo(inspect.currentframe())[0]
print os.path.dirname(os.path.abspath(__file__))
으로, 만, 가 「」를 사용하고 경우는, 「」가 .chdir()현재 디렉토리를 변경하는 것도 실패합니다.
주의:
sys.argv[0], 안 , 안 된다.-c를 ""로 실행한 경우python -c "execfile('path-tester.py')"- 저는 https://gist.github.com/1385555에 완전한 테스트를 게시했습니다. 개선해 주시면 감사하겠습니다.
이것은 대부분의 경우에 유효합니다.
import os,sys
dirname=os.path.dirname(os.path.realpath(sys.argv[0]))
이 되었으면 할 수 '/'에 접속할 수 있습니다.__file__입니다.
할 수 그 에는 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.이 변수에는 이름을 붙일 수 있습니다.NameError ★★★★★★★★★★★★★★★★★」os.getcwd()다른 장소에서 파일을 실행하고 있는 경우는, 에 의해서 잘못된 디렉토리가 표시됩니다.
이 솔루션은 모든 경우에 필요한 것을 제공합니다.
from inspect import getsourcefile
from os.path import abspath
abspath(getsourcefile(lambda:0))
충분히 테스트해 보지는 않았지만, 문제는 해결되었습니다.
if__file__사용할 수 있습니다.
# -- script1.py --
import os
file_path = os.path.abspath(__file__)
print(os.path.dirname(file_path))
인터프리터로부터 명령어를 실행하거나 스크립트를 실행하고 있는 장소의 경로를 취득할 수 있도록 하고 싶습니다.
# -- script2.py --
import os
print(os.path.abspath(''))
이것은 통역사로부터 동작합니다.그러나 스크립트에서 실행(또는 가져오기)할 경우 스크립트가 인쇄된 디렉토리의 경로가 아니라 스크립트를 실행한 위치의 경로를 제공합니다.
예:
디렉토리 구조가 다음과 같은 경우
test_dir (in the home dir)
├── main.py
└── test_subdir
├── script1.py
└── script2.py
와 함께
# -- main.py --
import script1.py
import script2.py
출력은 다음과 같습니다.
~/test_dir/test_subdir
~/test_dir
현재 스크립트를 포함하는 디렉토리에 대한 절대 경로를 가져오려면 다음을 사용합니다.
from pathlib import Path
absDir = Path(__file__).parent.resolve()
★★★★★★★★★★★★★★★★★★★★★에 주의해 주세요..resolve()콜이 필수입니다.이것은, 이 콜이 패스를 절대적인 것으로 하기 때문입니다.resolve() '하다, 하다, 하다, 하다' 이런 것을 수 있습니다'.'.
이 솔루션에서는 Python이 v3.4(2014) 이후 stdlib의 일부인 를 사용합니다.이는 다른 솔루션과 비교하여 권장되는 사항입니다.os.
★★★★★★★★★★★★★★★.pathlib에는 오래된 "Documentation"을 .oshttps://docs.python.org/3/library/pathlib.html#correspondence-to-tools-in-the-os-module에서 새로운 기능을 제공합니다.
이전 답변에서는 모듈을 Import해야 하기 때문에 Import하지 않는 답변을 하나 작성하려고 합니다.아무것도 Import 하지 않는 경우는, 다음의 코드를 사용해 주세요.
dir = '/'.join(__file__.split('/')[:-1])
print(dir)
/path/to/script.py그러면 이것이 인쇄될 것이다./path/to파일이 실행되지 않기 때문에 단말기에 오류가 발생한다는 점에 유의하십시오.입니다.__file__마지막 부분을 제거하는 거죠. 경우, 「 」/script.py하고, 「」을 합니다./path/to.
print(__import__("pathlib").Path(__file__).parent)
언급URL : https://stackoverflow.com/questions/3718657/how-do-you-properly-determine-the-current-script-directory
'programing' 카테고리의 다른 글
| 오류: eventlet 설치 중 종료 상태 1에서 명령 'gcc'가 실패했습니다. (0) | 2022.11.13 |
|---|---|
| Android ClassNotFoundException:경로에서 클래스를 찾을 수 없습니다. (0) | 2022.11.13 |
| "Unused variable x" 경고를 억제하는 가장 좋은 방법은 무엇입니까? (0) | 2022.11.13 |
| SQL을 INSERT IN...과(와) 함께 사용할 때 오류 1064가 발생합니다.선택...중복 키 업데이트 시 (0) | 2022.11.13 |
| @Transactional on class와 메서드의 차이점은 무엇입니까? (0) | 2022.11.13 |