文件相关的问题整理

问题一:difference between __file__ and sys.argv[0]


In [1]:
import os
os.listdir('question/one')


Out[1]:
['m.py', 'main.py', '__init__.py']

In [ ]:
# %load question/one/main.py
from . import m

In [ ]:
# %load question/one/m.py
import sys
import os
print('cwd', os.getcwd())
print('__file__:', __file__)
print('argv[0]:', sys.argv[0])
print('__name__:', __name__)

直接运行模块


In [2]:
!python  -m question.one.m


cwd F:\github\python-toolbox\books\files
__file__: F:\github\python-toolbox\books\files\question\one\m.py
argv[0]: F:\github\python-toolbox\books\files\question\one\m.py
__name__: __main__

In [3]:
!python  question/one/m.py


cwd F:\github\python-toolbox\books\files
__file__: question/one/m.py
argv[0]: question/one/m.py
__name__: __main__

作为被导入模块


In [4]:
!python  -m question.one.main


cwd F:\github\python-toolbox\books\files
__file__: F:\github\python-toolbox\books\files\question\one\m.py
argv[0]: F:\github\python-toolbox\books\files\question\one\main.py
__name__: question.one.m

从这两种不同的方式可以看出:

  • 脚本直接运行,sys.argv[0]__file__效果一样.
  • 作为被导入模块,__file__表示的是模块文件路径,sys.argv[0]表示的是运行的文件路径. 所以要想取得当前模块的路径,__file__才是正确的方式.

注意: 从直接运行方式可以看到直接以脚本而不是模块方式运行得到的是相对路径,所以需要调用os.path.abspath来取得绝对路径.