현재 실행 중인 파일의 경로와 이름을 얻으려면 어떻게 해야 합니까?
다른 스크립트 파일을 호출하는 스크립트가 있지만 프로세스 내에서 현재 실행 중인 파일의 파일 경로를 가져와야 합니다.
예를 들어, 파일이 3개 있다고 합시다.exec 파일 사용:
script_1.py
®script_2.py
- 국 in.
script_2.py
®script_3.py
의 파일명과 경로를 인수로 전달하지 않고 내의 코드에서 취득하려면 어떻게 해야 합니까?script_2.py
(실行中))os.getcwd()
는 현재 파일이 아닌 원래 시작 스크립트의 파일 경로를 반환합니다.)
__file__
남들이 말한 것처럼os.path.realpath를 사용하여 심볼링크를 삭제할 수도 있습니다.
import os
os.path.realpath(__file__)
p1.py:
execfile("p2.py")
p2.py:
import inspect, os
print (inspect.getfile(inspect.currentframe())) # script filename (usually with path)
print (os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))) # script directory
업데이트 2018-11-28:
다음은 Python 2와 3을 사용한 실험의 요약입니다.와 함께
.py - 실행 foo.main.py - foo opy 。 이이
py -bar.pyfoo.py - lib/bar.py 를 실행합니다
.py - expressions lib/bar.py - prints filepath expressions lib/bar.py - prints filepath expressions lib / .py
| Python | Run statement | Filepath expression |
|--------+---------------------+----------------------------------------|
| 2 | execfile | os.path.abspath(inspect.stack()[0][1]) |
| 2 | from lib import bar | __file__ |
| 3 | exec | (wasn't able to obtain it) |
| 3 | import lib.bar | __file__ |
2의 Python 2를 사용할 수 있도록 이 더 할 수 .from lib import bar
빈칸을 . - 빈칸을 넣어주세요.__init__.py
2번
3, Python 3의 ,execfile
하지 않습니다은 '있다' - '있다'입니다.exec(open(<filename>).read())
아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다. 쓰는 게 요.import foo
★★★★★★★★★★★★★★★★★」import lib.bar
안 돼 - 안 돼__init__.py
필요한 파일이 있습니다.
자세한 내용은 Import 파일과 exec 파일의 차이점을 참조하십시오.
원답:
다음은 이 스레드의 답변을 기반으로 한 실험입니다. Windows의 Python 2.7.10을 사용한 것입니다.
스택 베이스만이 신뢰할 수 있는 결과를 얻을 수 있다고 생각됩니다. 마지막 두 개의 구문이 가장 짧습니다. 예를 들어 -
print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib
여기에 함수로 sys에 추가되는 것을 축하드립니다!@Usagi 및 @pablog 크레딧
파일을 으로 폴더로부터 py 를 실행합니다.이 는 main.py 입니다.python main.py
(절대 경로를 사용하여 exec 파일을 시도하고 다른 폴더에서 호출합니다).
C:\filepaths\main.py:execfile('foo.py')
C:\filepaths\.py: py:execfile('lib/bar.py')
C:\filepaths\lib\bar.py:
import sys
import os
import inspect
print "Python " + sys.version
print
print __file__ # main.py
print sys.argv[0] # main.py
print inspect.stack()[0][1] # lib/bar.py
print sys.path[0] # C:\filepaths
print
print os.path.realpath(__file__) # C:\filepaths\main.py
print os.path.abspath(__file__) # C:\filepaths\main.py
print os.path.basename(__file__) # main.py
print os.path.basename(os.path.realpath(sys.argv[0])) # main.py
print
print sys.path[0] # C:\filepaths
print os.path.abspath(os.path.split(sys.argv[0])[0]) # C:\filepaths
print os.path.dirname(os.path.abspath(__file__)) # C:\filepaths
print os.path.dirname(os.path.realpath(sys.argv[0])) # C:\filepaths
print os.path.dirname(__file__) # (empty string)
print
print inspect.getfile(inspect.currentframe()) # lib/bar.py
print os.path.abspath(inspect.getfile(inspect.currentframe())) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # C:\filepaths\lib
print
print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib
print
이게 더 깨끗한 것 같아
import inspect
print inspect.stack()[0][1]
다음과 같은 정보를 얻을 수 있습니다.
print inspect.getfile(inspect.currentframe())
여기서 [0]은 스택(스택의 상단)의 현재 프레임이고 [1]은 파일 이름의 경우 스택에서 뒤로 이동하려면 증가합니다.
print inspect.stack()[1][1]
현재 프레임을 호출한 스크립트의 파일 이름입니다.또, [-1]을 사용하면, 원래의 콜 스크립트인 스택의 맨 아래에 액세스 할 수 있습니다.
import os
os.path.dirname(__file__) # relative directory path
os.path.abspath(__file__) # absolute file path
os.path.basename(__file__) # the file name only
스크립트가 1개의 파일만으로 구성되어 있는 경우 best로 표시된 제안은 모두 true입니다.
모듈로 Import할 수 있는 파일에서 실행 파일의 이름(즉, 현재 프로그램의 python interpreter에 전달된 루트 파일)을 확인하려면 다음을 수행해야 합니다(이것이 foo.py이라는 파일에 있다고 가정합니다).
import inspect
print inspect.stack()[-1][1]
마지막 한 가지마지막 한 가지)는[-1]
스택에 가장 먼저 들어간 것이 스택입니다(스택은 LIFO/FILO 데이터 구조입니다).
그런 다음 파일 bar.py에 저장하십시오.import foo
foo.py 가 아닌 bar.py 이 인쇄됩니다.이 모든 것이 이 모든 것의 가치가 있습니다.
__file__
inspect.getfile(inspect.currentframe())
inspect.stack()[0][1]
에 Python 3를 .pathlib
이제 파일 및 경로 정보에 액세스하기 위한 더 나은 도구가 될 수 있습니다.
from pathlib import Path
current_file: Path = Path(__file__).resolve()
파일의 는, 「Directory」를 추가하는 ..parent
Path()
★★★★★★★★
current_path: Path = Path(__file__).parent.resolve()
"프로세스 내에서 현재 실행 중인 파일의 파일 경로"가 의미하는 바가 완전히 명확하지는 않습니다. sys.argv[0]
에는 보통 Python 인터프리터에 의해 호출된 스크립트의 위치가 포함되어 있습니다.상세한 것에 대하여는, sys 메뉴얼을 참조해 주세요.
@Tim 및 @Pat Notz가 지적한 바와 같이 __file_Atribute를 사용하여
모듈이 파일에서 로드된 경우 모듈이 로드된 파일
import os
print os.path.basename(__file__)
파일 이름만 알 수 있습니다.즉, 파일의 abspath가 c:\abcd\abc.py인 경우 두 번째 줄은 abc를 출력합니다.화이
Windows 환경에서 동작해야 하는 스크립트가 있습니다.이 코드 스니핑은 이것으로 끝입니다.
import os,sys
PROJECT_PATH = os.path.abspath(os.path.split(sys.argv[0])[0])
꽤 현명한 결정이에요하지만 외부 도서관은 필요 없고, 제 경우 가장 중요한 것입니다.
이거 드셔보세요.
import os
os.path.dirname(os.path.realpath(__file__))
import os
os.path.dirname(os.path.abspath(__file__))
검사나 다른 라이브러리는 필요 없습니다.
Import한 스크립트와 같은 폴더에 있는 Configuration파일을 사용하는 스크립트(실행된 스크립트와는 다른 디렉토리)를 Import 할 필요가 있을 때는 이 방법이 도움이 되었습니다.
__file__
속성은 메인 실행 코드가 포함된 파일과 Import된 모듈 모두에 대해 작동합니다.
https://web.archive.org/web/20090918095828/http://pyref.infogami.com/__file__ 를 참조해 주세요.
import sys
print sys.path[0]
그러면 현재 실행 중인 스크립트의 경로가 인쇄됩니다.
그런 것 요.__file__
검사 모듈도 체크해야 할 것 같습니다.
사용할 수 있습니다.inspect.stack()
import inspect,os
inspect.stack()[0] => (<frame object at 0x00AC2AC0>, 'g:\\Python\\Test\\_GetCurrentProgram.py', 15, '<module>', ['print inspect.stack()[0]\n'], 0)
os.path.abspath (inspect.stack()[0][1]) => 'g:\\Python\\Test\\_GetCurrentProgram.py'
import sys
print sys.argv[0]
print(__file__)
print(__import__("pathlib").Path(__file__).parent)
이 조작은 유효합니다.
import os,sys
filename=os.path.basename(os.path.realpath(sys.argv[0]))
dirname=os.path.dirname(os.path.realpath(sys.argv[0]))
이것은 내가 사용하는 것이기 때문에 아무 문제 없이 어디에나 코드를 던질 수 있다. __name__
항상 정의되어 있지만__file__
코드가 파일로 실행되는 경우에만 정의됩니다(예: IDLE/iPython에서 정의되지 않음).
if '__file__' in globals():
self_name = globals()['__file__']
elif '__file__' in locals():
self_name = locals()['__file__']
else:
self_name = __name__
또는 다음과 같이 쓸 수 있습니다.
self_name = globals().get('__file__', locals().get('__file__', __name__))
스크립트 실행 디렉토리를 가져오려면
print os.path.dirname( inspect.getfile(inspect.currentframe()))
__file_과(와) 함께 접근 방식을 사용했습니다.
os.path.abspath(__file__)
하지만 작은 트릭이 있습니다.첫 번째 코드가 실행될 때 .py 파일을 반환하고 다음 실행에서는 *.pyc 파일의 이름을 지정합니다.
그래서 숙박했습니다.
inspect.getfile(inspect.currentframe())
or or or openicle.
sys._getframe().f_code.co_filename
이클립스 디버거와 unittest를 고려한 함수를 작성했습니다.처음 실행한 스크립트의 폴더를 반환합니다.임의로 __file__ var를 지정할 수 있지만, 가장 중요한 것은 이 변수를 모든 발신 계층 간에 공유할 필요가 없다는 것입니다.
내가 보지 못한 사건들을 다른 사람들이 처리할 수 있을지도 모르지만, 난 괜찮아.
import inspect, os
def getRootDirectory(_file_=None):
"""
Get the directory of the root execution file
Can help: http://stackoverflow.com/questions/50499/how-do-i-get-the-path-and-name-of-the-file-that-is-currently-executing
For eclipse user with unittest or debugger, the function search for the correct folder in the stack
You can pass __file__ (with 4 underscores) if you want the caller directory
"""
# If we don't have the __file__ :
if _file_ is None:
# We get the last :
rootFile = inspect.stack()[-1][1]
folder = os.path.abspath(rootFile)
# If we use unittest :
if ("/pysrc" in folder) & ("org.python.pydev" in folder):
previous = None
# We search from left to right the case.py :
for el in inspect.stack():
currentFile = os.path.abspath(el[1])
if ("unittest/case.py" in currentFile) | ("org.python.pydev" in currentFile):
break
previous = currentFile
folder = previous
# We return the folder :
return os.path.dirname(folder)
else:
# We return the folder according to specified __file__ :
return os.path.dirname(os.path.realpath(_file_))
가장 간단한 방법은 다음과 같습니다.
script_1.py:
import subprocess
subprocess.call(['python3',<path_to_script_2.py>])
script_2로 설정합니다.py:
sys.argv[0]
추신: 노력했습니다.execfile
라고 있기 에, 「」, 「script_2.py」가 됩니다sys.argv[0]
<string>
.
다음은 현재 기본 스크립트가 위치한 경로를 반환합니다.Linux, Win10, IPython 및 Jupyter Lab에서 테스트했습니다.로컬 Jupyter 노트북에서도 사용할 수 있는 솔루션이 필요했습니다.
import builtins
import os
import sys
def current_dir():
if "get_ipython" in globals() or "get_ipython" in dir(builtins):
# os.getcwd() is PROBABLY the dir that hosts the active notebook script.
# See also https://github.com/ipython/ipython/issues/10123
return os.getcwd()
else:
return os.path.abspath(os.path.dirname(sys.argv[0]))
언급URL : https://stackoverflow.com/questions/50499/how-do-i-get-the-path-and-name-of-the-file-that-is-currently-executing
'programing' 카테고리의 다른 글
PHP에는 스레드 기능이 있습니까? (0) | 2022.09.19 |
---|---|
문자열을 기반으로 동적으로 PHP 개체 생성 (0) | 2022.09.19 |
Eclipse 실행 시 기본 라이브러리를 재정의하지 않고 "java.library.path"에 추가하는 방법 (0) | 2022.09.19 |
MySQL 오류 1241: 오퍼랜드에 1개의 열이 포함되어 있어야 합니다. (0) | 2022.09.19 |
왜 닫는 태그를 생략합니까? (0) | 2022.09.19 |