Вызов сценария .py из определенного пути к файлу в интерпретаторе Python

Я только начинаю с Python.
Как вызвать тестовый скрипт из каталога C: \ X \ Y \ Z в командной строке интерпретатора Python в интерактивном режиме? Как указать полный путь для файла, если он не находится в текущем рабочем каталоге?

Я могу вызвать тестовый скрипт при использовании команды запуска Windows с «python -ic: \ X \ Y \ Z \ filename.py», и она работает нормально. Но я хочу, чтобы иметь возможность называть его формой терминала Python с приглашением «>>>».

(Я искал и искал два часа и не мог найти ответа на это, хотя похоже, что это должен быть общий вопрос для новичка и легкая вещь).

благодаря

Поскольку вы используете обратную косую черту для пути к файлу, python интерпретирует это как «escape-символы». При написании пути к файлу в Python обязательно используйте косую черту.

with open("C:/X/Y/Z/filename.py", "r") as file: exec(file.read()) 

Двойная обратная косая черта также работает, но я предпочитаю более чистый внешний вид косых черт.

Если вы хотите импортировать его в REPL:

 import sys sys.path.append('c:\X\Y\Z') import filename 

Если вы хотите выполнить код из файла внутри интерпретатора, вы можете использовать execfile

 execfile('C:/X/Y/Z/filename.py') 

( / работает как разделитель путей во всех операционных системах, если вы используете \ , вам нужно их избежать ( 'C:\\X\\Y\\Z\\filename.py' ) или использовать строковый литерал строки ( r'C:\X\Y\Z\filename.py' ))

Если вы используете IPython (и вы должны использовать его гораздо полезнее, чем ванильный интерактивный Python), вы можете использовать run магической функции (или с % prefix: %run ):

 run C:\\X\\Y\\Z\\filename.py %run C:\\X\\Y\\Z\\filename.py 

См. Эту ссылку для получения дополнительной информации о магических функциях.

И, кстати, у него даже автозаполнение имен файлов.

Извлеките из него

Python 2.x:

 execfile("C:\\X\Y\\Z") 

Python 3+:

 with open("C:\\X\Y\\Z", "r") as f: exec(f.read()) 

Тем не менее, это очень плохая практика – она ​​выполняет код из строки (в какой-то момент), вместо использования предпочтительного и безопасного способа импорта модулей. Тем не менее, когда вы импортируете модуль и имеете некоторый код после « -f __name__ == '__main__' :« эти части не будут работать (поскольку __name__ в импортированном модуле не будет __main__ , и это было бы, если бы вы запускал его как один скрипт).

Это плохо по многим причинам, в некотором смысле сильно связанным с Zen of Python, но если вы новичок, это должно говорить вам:

Когда вы делаете что-либо в интерактивном режиме, вы работаете над некоторым пространством имен (этот термин очень важен для понимания python, если вы этого не знаете, проверьте его на языке языка python). Когда вы выполняете exec() / execfile() не предоставляя globals() / locals() , вы можете получить модифицированное пространство имен.

Модифицированное пространство имен?

Что это значит? Позволяет иметь такой скрипт:

 radius = 3 def field_of_circle(r): return r*r*3.14 print(field_of_circle(radius)) 

Теперь у вас есть следующая сессия:

 >>>radius = 5 >>>execfile("script_above.py") 28.26 >>>print(radius) 3 

Вы видите, что происходит? Переменные, определенные вами в интерактивном сеансе, будут перезаписаны значениями из конца сценария. То же самое касается модификации уже импортированных внешних модулей. Позволяет иметь очень простой модуль:

 x = 1 

и выполненный скрипт:

 import very_simple_module very_simple_module.x = 3 

Итак, вот интерактивный сеанс переводчика:

 >>>import very_simple_module >>>print(very_simple_module.x) 1 >>>execfile("executed_script.py") >>>print(very_simple_module.x) 3 

Запустить другой интерпретатор

Интерактивные сессии очень полезны для многих вещей, но не для многих, но запуск сценариев python не является одним из них.

Если … вы хотите играть жестко и использовать оболочку python как системную оболочку. Затем вы можете использовать подпроцесс (в стандартной библиотеке) или sh (который можно найти в PyPI ):

 >>>import subprocess >>>subprocess.call(["python", "C:\\X\Y\\Z"], shell=True) >>>from sh import python >>>python("C:\\X\Y\\Z") 

У них не будет этой проблемы с изменением пространства имен интерактивных интерпретаторов

См. Сценарий как модуль

Кроме того, есть еще один вариант: в интерактивном сеансе добавьте каталог со сценарием в pythonpath и импортируйте модуль, названный как скрипт:

 >>>import sys >>>if "C:\\X\\Y" not in sys.path: sys.path.append("C:\\X\\Y") >>>import Z 

Помните, что каталог, в котором был запущен интерпретатор, автоматически находится на pythonpath, поэтому, если вы запустили python в том же каталоге, что и ваш скрипт, вам просто нужно использовать третью строку выше.

Интерпретаторы пространства имен не будут меняться, но код после « -f __name__ == '__main__' :» не будет выполнен. Тем не менее вы можете получить доступ к переменным скриптов:

 >>>radius = 5 >>>import first_example_script >>>print(radius) 5 >>>print(first_example_script.radius) 3 

Кроме того, у вас может возникнуть конфликт имен модулей. Например, если ваш скрипт был sys.py, то это решение будет работать, потому что python будет импортировать встроенный sys модуль перед вашим.