Хорошо, вот что я делаю.
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\
it всегда будет выводить это независимо от того, вводите ли вы 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
Так как вы можете видеть файл, вы всегда получаете файл python, из которого он запускается, где sys.argv [0] дает вам файл, который вы использовали из интерпретации всегда. В зависимости от ваших потребностей вам нужно будет выбрать, какой из них лучше всего подходит вашим потребностям.
Typcript поддерживает это со специальным типом возврата, X is A
. Вы можете прочитать об этом подробнее в своем разделе о пользовательских типах охранников .
В качестве примера вы можете ввести его так:
class A {}
class B extends A {
bb() { ... }
}
function isB(obj: A): obj is B { // <-- note the return type here
return obj instanceof B;
}
const x: A = new B(); // x has type A
if (isB(x)) {
x.bb(); // x is now narrowed to type B
}