Як виконати файл в інтерпретаторі python?


289

Я намагаюся виконати файл із командами python з інтерпретатора.

EDIT: Я намагаюся використовувати змінні та налаштування з цього файлу, а не викликати окремий процес.


2
os модуль, і я перевіряю інші відповіді.
Адам Матан

2
Пропонована ос.система; І видалила відповідь, коли я прочитала EDIT: - /
lampong

Відповіді:


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 (), здається, не працює якось ... не впевнений, що я роблю неправильно. Ви можете оновити відповідь?
тимчасовий_користувач

Чи є який-небудь спосіб надати stdinз файлу, як, наприклад, використання <до сценарію виконання з execfile(). @ s-lott
bhanu

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 після його виконання.


Що робить метод читання? На жаль, офіційний сайт документації не дає чіткого прикладу та пояснень.
Дмитро

Він читає файл і повертає (за замовчуванням) весь вміст в одному рядку, див., Наприклад, сторінку 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


1
Ви - мій герой! Я боровся з деякими по-справжньому дивними речами цілими днями, коли os.getcwd () сказав одне, але glob ("*") працював в іншому каталозі ... Дякую! Дякую!
pallevillesen

Чи є спосіб передати параметр сценарію? не працює: exec (відкрити "setup.py install"). read (), globals ())
ben

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змінний спам та яйця функції - ви можете імпортувати їх import cheddar, отримати доступ до змінної cheddar.spamта запустити функцію, зателефонувавшиcheddar.eggs()

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


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, і ви вводите просто "імпортувати мій код", Python виконає його, але він не зробить всі ваші змінні доступними для інтерпретатора. Я виявив, що вам слід ввести фактично "з імпорту мого коду *", якщо ви хочете зробити всі змінні доступними для перекладача.


3
Плюс, це повинен бути коментар, а не відповідь.
Адам Матан

9

Просто роби,

from my_file import *

Не додавайте розширення .py. Якщо ваш .py файл використовується в підкаталозі,

from my_dir.my_file import *

Мені це здається найелегантнішим.
Массіміліано Краус

8

Для використання Python3 або з xxxx = nameз yourfile.

exec(open('./xxxx.py').read())

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.