好,这就是我要做的
sys.argv始终是您在终端中键入的内容,还是在使用python.exe或pythonw.exe执行它时用作文件路径的内容
例如,您可以通过几种方式运行文件text.py,它们分别为您提供不同的答案,并始终为您提供python键入的路径。
C:\Documents and Settings\Admin>python test.py
sys.argv[0]: test.py
C:\Documents and Settings\Admin>python "C:\Documents and Settings\Admin\test.py"
sys.argv[0]: C:\Documents and Settings\Admin\test.py
好的,知道您可以获取文件名,现在很重要,现在可以使用os.path来获取应用程序目录,特别是abspath和dirname
import sys, os
print os.path.dirname(os.path.abspath(sys.argv[0]))
这将输出以下内容:
C:\Documents and Settings\Admin\
无论您键入python test.py还是python“ C:\ Documents and Settings \ Admin \ test.py”,它将始终输出此信息
使用__file__的问题
考虑这两个文件test.py
import sys
import os
def paths():
print "__file__: %s" % __file__
print "sys.argv: %s" % sys.argv[0]
a_f = os.path.abspath(__file__)
a_s = os.path.abspath(sys.argv[0])
print "abs __file__: %s" % a_f
print "abs sys.argv: %s" % a_s
if __name__ == "__main__":
paths()
import_test.py
import test
import sys
test.paths()
print "--------"
print __file__
print sys.argv[0]
输出“ python test.py”
C:\Documents and Settings\Admin>python test.py
__file__: test.py
sys.argv: test.py
abs __file__: C:\Documents and Settings\Admin\test.py
abs sys.argv: C:\Documents and Settings\Admin\test.py
输出“ python test_import.py”
C:\Documents and Settings\Admin>python test_import.py
__file__: C:\Documents and Settings\Admin\test.pyc
sys.argv: test_import.py
abs __file__: C:\Documents and Settings\Admin\test.pyc
abs sys.argv: C:\Documents and Settings\Admin\test_import.py
--------
test_import.py
test_import.py
因此,您可以看到file始终为您提供正在运行的python文件,而sys.argv [0]始终为您提供从解释器运行的文件。根据您的需求,您将需要选择最适合您的需求。
__file__
无法使用,请使用sys.argv[0]
代替dirname(__file__)
。其余应按预期工作。我喜欢使用它,__file__
因为在库代码中,sys.argv[0]
可能根本不指向您的代码,尤其是通过某些第三方脚本导入时。