Как выполнить файл в интерпретаторе Python?

289

Я пытаюсь выполнить файл с командами Python из интерпретатора.

РЕДАКТИРОВАТЬ: я пытаюсь использовать переменные и настройки из этого файла, чтобы не вызывать отдельный процесс.

Адам Матан
источник
2
модуль ос, и я проверяю другие ответы.
Адам Матан
2
Предлагаемая os.system; И удалил ответ, когда я прочитал РЕДАКТИРОВАТЬ: - /
Световая Песня

Ответы:

229

Несколько путей.

Из скорлупы

python someFile.py

Изнутри IDLE, нажмите F5 .

Если вы печатаете в интерактивном режиме, попробуйте это: ( только Python 2 !)

>>> variables= {}
>>> execfile( "someFile.py", variables )
>>> print variables # globals from the someFile module

Для Python3 используйте:

>>> exec(open("filename.py").read())
С. Лотт
источник
10
pythonне работает, если вы используете Python 3, python3используется вместо этого.
pzkpfw
41
Execfile больше не существует в python3, и exec (), похоже, не работает как-то ... не знаю, что я делаю неправильно. не могли бы вы обновить ответ?
temporary_user_name
Есть ли способ предоставить stdinиз файла, как использование <для выполнения сценария с в execfile().? @ s-
lott
9
@pzkpfw python может указывать на любую версию python. Я видел среды только с Python v3, где pythonуказывает на python3.
StockB
2
@pzkpfw Это зависит от того, какой pythonисполняемый файл система находит при просмотре папок в переменной среды PATH.
Hellogoodbye
254

Для Python 2:

>>> execfile('filename.py')

Для Python 3:

>>> exec(open("filename.py").read())
# or
>>> from pathlib import Path
>>> exec(Path("filename.py").read_text())

Смотрите документацию . Если вы используете Python 3.0, посмотрите этот вопрос .

См. Ответ @ S.Lott для примера того, как вы получаете доступ к глобальным файлам из filename.py после его выполнения.

codeape
источник
Что делает метод чтения? К сожалению, официальный сайт документации не дает четкого примера и объяснения.
Дмитрий
Он читает файл и возвращает (по умолчанию) все содержимое в одну строку, см., Например, страницу w3schools при открытии файла .
Макс
Вот документы для open (): docs.python.org/3/library/io.html
codeape
96

Python 2 + Python 3

exec(open("./path/to/script.py").read(), globals())

Это выполнит сценарий и поместит все его глобальные переменные в глобальную область интерпретатора (нормальное поведение в большинстве сред сценариев).

execДокументация Python 3

Waylon Flinn
источник
1
Ты мой герой! Я боролся с некоторыми действительно странными вещами в течение нескольких дней, когда os.getcwd () сказал одно, но glob ("*") работал в другом каталоге ... Спасибо! Спасибо!
Pallevillesen
Есть ли способ передать параметр в сценарий? следующее не работает: exec (откройте «setup.py install»). read (), globals ())
бен
1
@ben, который не будет работать, потому что openнепосредственно читает код из скрипта. Чтобы передать аргументы, посмотрите на этот ответ , но вместо этого execfile, очевидно, используйте execи openкак показано выше.
Нико
47

Удивлен, я еще не видел это. Вы можете выполнить файл и затем оставить интерпретатор открытым после завершения выполнения, используя -iопцию:

| foo.py |
----------
testvar = 10

def bar(bing):
  return bing*3

--------



$ python -i foo.py
>>> testvar 
10
>>> bar(6)
18
Беннетт Талперс
источник
30

Я пытаюсь использовать переменные и настройки из этого файла, чтобы не вызывать отдельный процесс.

Что ж, простой импорт файла с import filename(минус .py, должен находиться в том же каталоге или на вашем PYTHONPATH) запустит файл, сделав его переменные, функции, классы и т. Д. Доступными в filename.variableпространстве имен.

Так что, если у вас есть cheddar.pyпеременная spam и функция eggs, вы можете импортировать их с помощью import cheddar, получить доступ к переменной с помощью cheddar.spamи запустить функцию, вызвавcheddar.eggs()

Если у вас есть код, cheddar.pyкоторый находится за пределами функции, он будет запущен немедленно, но сборка приложений, запускающих что-либо при импорте, усложнит повторное использование вашего кода. Если все возможно, поместите все внутри функций или классов.

Mikl
источник
4
Это не будет использовать глобальное пространство имен, как требует вопрос. Используйте вместо этогоfrom filename import *
Рикардо Крус
В вопросе конкретно не упоминается использование глобального пространства имен, это может быть тем, что хочет ОП, но это не очевидно из вопроса.
ryanpcmcquen
13

На мой взгляд, лучший способ это:

import yourfile

и после изменения yourfile.py

reload(yourfile)   

или

import imp; 
imp.reload(yourfile) in python3

но это сделает функцию и классы похожими на это: yourfile.function1, yourfile.class1 .....

Если вы не можете принять их, окончательное решение:

reload(yourfile)
from yourfile import *
Нео ли
источник
9

Я не эксперт, но вот что я заметил:

если ваш код, например, mycode.py, и вы набираете просто «import mycode», Python выполнит его, но не сделает все ваши переменные доступными для интерпретатора. Я обнаружил, что на самом деле вы должны печатать «из mycode import *», если хотите сделать все переменные доступными для интерпретатора.

Carlos E Orozco
источник
3
Плюс, это должен быть комментарий, а не ответ.
Адам Матан,
9

Просто сделать,

from my_file import *

Не добавляйте расширение .py. Если ваш .py файл в подкаталоге используется,

from my_dir.my_file import *
Шиталь шах
источник
Это кажется самым элегантным для меня.
Массимилиано Краус
8

Для python3 используйте либо с xxxx = nameof yourfile.

exec(open('./xxxx.py').read())
AMG
источник
8

Для Python 3:

>>> exec(open("helloworld.py").read())

Убедитесь, что вы находитесь в правильном каталоге, прежде чем запускать команду.

Чтобы запустить файл из другого каталога, вы можете использовать следующую команду:

with open ("C:\\Users\\UserName\\SomeFolder\\helloworld.py", "r") as file:
    exec(file.read())
Прашант Гонга
источник
1

Предположим, вы хотите следующие функции:

  1. Исходный файл ведет себя правильно в вашем отладчике (имя файла отображается в стеке и т. Д.)
  2. __name__ == '__main__' Истинно, поэтому скрипты ведут себя как скрипты.

Функция exec(open('foo.py').read())неудач 1 import fooСтратегия неудач 2

Чтобы получить оба, вам нужно это:

    source = open(filename).read()
    code = compile(source, filename, 'exec')
    exec(code)
user3667349
источник