2018-11-28 업데이트 :
다음은 Python 2 및 3 실험에 대한 요약입니다.
main.py는 - foo.py 실행
foo.py을 - 실행 lib 디렉토리 / bar.py
lib 디렉토리 / bar.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__ |
Python 2의 경우 패키지로 전환하는 것이 더 명확 할 수 있으므로 두 개의 폴더에 from lib import bar
빈 __init__.py
파일을 추가 하기 만하면 됩니다.
Python 3의 경우 execfile
존재하지 않습니다. 가장 가까운 대안은 exec(open(<filename>).read())
스택 프레임에 영향을 미치지 만입니다. 그것은 단순한 그냥 사용하지하는의 import foo
와 import lib.bar
더 - __init__.py
필요한 파일을.
import와 execfile의 차이점 도 참조하십시오.
원래 답변 :
다음은이 스레드의 답변을 기반으로 한 실험입니다-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의 신용
다음 세 파일을 기반으로 폴더에서 main.py를 실행하여 python main.py
(절대 경로가있는 execfile을 시도하고 별도의 폴더에서 호출).
C : \ filepaths \ main.py : execfile('foo.py')
C : \ filepaths \ foo.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
__file__
속성 절대 또는 상대?