У меня есть сценарии, вызывающие другие файлы сценариев, но мне нужно получить путь к файлу, который в данный момент выполняется в процессе.
Например, допустим, у меня есть три файла. Использование execfile :
script_1.py
звонкиscript_2.py
.- В свою очередь
script_2.py
звонкиscript_3.py
.
Как я могу получить имя файла и путь script_3.py
, из кода внутриscript_3.py
, без необходимости передавать эту информацию в качестве аргументов script_2.py
?
(Выполнение os.getcwd()
возвращает исходный путь к файлу исходного сценария, а не текущий файл.)
__file__
абсолютный или относительный?Ответы:
p1.py:
p2.py:
источник
inspect.getabsfile()
и он работал для всех случаев, которые я пытался.os.path.realpath(__file__)
как говорили другие. Вы также можете использовать os.path.realpath для удаления символических ссылок:
источник
__file__
возвращает «script_name.py», а иногда «script_name.pyc». Таким образом, вывод не является стабильным."__file__"
в кавычках (в виде строки) выдает dir, из которого запускается cmd, но__file__
(без кавычек - путь к исходному файлу ... почему это такos.path.realpath
функция принимает заdir
часть пути.os.path.dirname(os.path.realpath(__file__))
возвращает каталог с файлом.os.path.dirname(os.path.realpath("__file__"))
возвращает cwd.os.path.dirname(os.path.realpath("here_be_dragons"))
также возвращает CWD.Обновление 2018-11-28:
Вот краткое изложение экспериментов с Python 2 и 3. С
main.py - запускает foo.py
foo.py - запускает lib / bar.py
lib / bar.py - печатает выражения filepath
Для Python 2 может быть понятнее переключиться на пакеты, которые можно использовать
from lib import bar
- просто добавьте пустые__init__.py
файлы в две папки.Для Python 3
execfile
не существует - ближайшая альтернатива естьexec(open(<filename>).read())
, хотя это влияет на кадры стека. Проще всего просто использоватьimport foo
иimport lib.bar
-__init__.py
файлы не нужны.Смотрите также Разница между import и execfile
Оригинальный ответ:
Вот эксперимент, основанный на ответах в этой теме - с Python 2.7.10 для Windows.
Основанные на стеке - единственные, которые, кажется, дают надежные результаты. Последние два имеют самый короткий синтаксис , то есть -
Вот к ним добавляются sys как функции! Кредит @Usagi и @pablog
На основе следующих трех файлов и запуска main.py из его папки с
python main.py
(также пробовал execfiles с абсолютными путями и вызовами из отдельной папки).C: \ filepaths \ main.py:
execfile('foo.py')
C: \ filepaths \ foo.py:
execfile('lib/bar.py')
C: \ filepaths \ lib \ bar.py:
источник
Я думаю, что это чище
и получает ту же информацию, что и:
Где [0] - текущий кадр в стеке (вершина стека), а [1] - для имени файла, увеличьте, чтобы вернуться в стек, т.е.
будет именем файла скрипта, который вызвал текущий кадр. Кроме того, использование [-1] приведет вас к нижней части стека, к исходному скрипту вызова.
источник
inspect.getfile()
возвращает__file__
атрибут, если передан объект модуля.inspect.currentframe()
возвращает модуль. Ergo, это дорогой способ сказать__file__
.inspect.stack()
это довольно дорогая функция, более чем простоinspect.currentframe()
, и она тоже вызываетinspect.getfile()
объект модуля.источник
__file__
.os.path.dirname
даст вам относительный путь, откуда вы запускаете скрипт. например , в будет и не абсолютный путь к сценарию. Я искал abspath, но удаляю имя скрипта. Первый элемент sys.path, по-видимому, является ответом .python ../../test.py
os.path.dirname
../../
sys.path[0]
Все предложения, помеченные как лучшие, верны, если ваш сценарий состоит только из одного файла.
Если вы хотите узнать имя исполняемого файла (то есть корневого файла, переданного интерпретатору python для текущей программы) из файла, который может быть импортирован как модуль, вам нужно сделать это (предположим, это в файле с именем foo.py ):
import inspect
print inspect.stack()[-1][1]
Потому что последнее, что (
[-1]
) в стеке - это первое, что вошло в него (стеки - это структуры данных LIFO / FILO).Затем в файле bar.py, если вы
import foo
будете печатать bar.py , а не foo.py , который будет значением всех этих:__file__
inspect.getfile(inspect.currentframe())
inspect.stack()[0][1]
источник
sys.modules['__main__'].__file__
действительно дорогой способ написания .это даст нам только имя файла. т.е. если abspath файла c: \ abcd \ abc.py, то во 2-й строке будет напечатано abc.py
источник
Не совсем понятно, что вы подразумеваете под «путем к файлу файла, который в данный момент выполняется в процессе».
sys.argv[0]
обычно содержит местоположение скрипта, который был вызван интерпретатором Python. Проверить документации sys для более подробной информации.Как указали @Tim и @Pat Notz, атрибут __file__ обеспечивает доступ к
источник
У меня есть скрипт, который должен работать в среде Windows. С этим фрагментом кода я закончил:
это довольно хакерское решение. Но это не требует никаких внешних библиотек, и это самое главное в моем случае.
источник
Попробуй это,
источник
Нет необходимости проверять или любую другую библиотеку.
Это сработало для меня, когда мне пришлось импортировать скрипт (из другого каталога, чем исполняемый скрипт), который использовал файл конфигурации, находящийся в той же папке, что и импортированный скрипт.
источник
__file__
Атрибут работает как для файла , содержащего основной код выполнения, а также импортируемых модулей.См. Https://web.archive.org/web/20090918095828/http://pyref.infogami.com/__file__
источник
это напечатало бы путь выполняемого в данный момент скрипта
источник
Я думаю, что это просто
__file__
звучит так, как будто вы также можете проверить модуль проверки .источник
Ты можешь использовать
inspect.stack()
источник
Поскольку Python 3 является довольно распространенным, я хотел включить
pathlib
ответ, так как считаю, что сейчас он, вероятно, является лучшим инструментом для доступа к информации о файлах и путях.Если вы ищете каталог текущего файла, это так же просто, как добавить
.parent
вPath()
оператор:источник
источник
Это должно работать:
источник
источник
Получить каталог исполняемого скрипта
источник
Я всегда использовал функцию os текущего рабочего каталога или CWD. Это часть стандартной библиотеки, и ее очень легко реализовать. Вот пример:
источник
python script.py
команду в той же папке, в которой вы уже находитесь, хотя в действительности она такая же, как иpwd
в Linux.Я использовал подход с __file__,
os.path.abspath(__file__)
но есть небольшой трюк, он возвращает файл .py при первом запуске кода, при следующих запусках дается имя файла * .pyc,
поэтому я остался с:
inspect.getfile(inspect.currentframe())
или
sys._getframe().f_code.co_filename
источник
Я написал функцию, которая принимает во внимание отладчик затмения и unittest . Возвращает папку первого запускаемого вами скрипта. При желании вы можете указать переменную __file__ , но главное - вам не нужно совместно использовать эту переменную во всей иерархии вызовов .
Может быть, вы справитесь с другими сложными случаями, которых я не видел, но для меня это нормально.
источник
Чтобы сохранить согласованность миграции между платформами (macOS / Windows / Linux), попробуйте:
path = r'%s' % os.getcwd().replace('\\','/')
источник
Самый простой способ это:
в script_1.py:
в script_2.py:
PS: я пытался
execfile
, но так как он читает script_2.py в виде строки,sys.argv[0]
вернулся<string>
.источник
Вот то, что я использую, чтобы я мог бросить свой код в любом месте без проблем.
__name__
всегда определяется, но__file__
определяется только тогда, когда код запускается как файл (например, не в IDLE / iPython).В качестве альтернативы это может быть записано как:
источник
Большинство из этих ответов были написаны на Python версии 2.x или более ранней. В Python 3.x синтаксис для функции печати изменился и теперь требует скобок, то есть print ().
Итак, этот более ранний ответ от user13993 в Python 2.x:
Становится в Python 3.x:
источник
если вы хотите просто имя файла без,
./
или.py
вы можете попробовать этоfile_name
напечатает тестовый скрипт, который вы можете сгенерировать как угодно, изменив индекс внутри []источник
источник