pythonrc в интерактивном коде - PullRequest
2 голосов
/ 09 ноября 2010

У меня в пути есть .pythonrc, который загружается при запуске python:

python
Loading pythonrc
>>>

Проблема в том, что мой .pythonrc не загружается при выполнении файлов:

python -i script.py
>>>

Было бы очень удобно иметь завершение табуляции (и некоторые другие вещи), когда я загружаю вещи в интерактивном режиме.

Ответы [ 4 ]

3 голосов
/ 09 ноября 2010

Из документации Python для -i:

Когда сценарий передается в качестве первого аргумента или используется опция -c , введитеинтерактивный режим после выполнения сценария или команды, даже если sys.stdin не является терминалом.Файл PYTHONSTARTUP не читается.

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

1 голос
/ 09 ноября 2010

Как отметил Грег, есть очень веская причина, по которой -i ведет себя так, как он.Тем не менее, я считаю весьма полезным иметь возможность загружать мой PYTHONSTARTUP, когда я хочу интерактивный сеанс.Итак, вот код, который я использую, когда я хочу, чтобы PYTHONSTARTUP был активным в скрипте, запущенном с -i.

if __name__ == '__main__':
    #do normal stuff
    #and at the end of the file:
    import sys
    if sys.flags.interactive==1:
       import os
       myPythonPath = os.environ['PYTHONSTARTUP'].split(os.sep)
       sys.path.append(os.sep.join(myPythonPath[:-1]))
       pythonrcName = ''.join(myPythonPath[-1].split('.')[:-1]) #the filename minus the trailing extension, if the extension exists
       pythonrc = __import__(pythonrcName)
       for attr in dir(pythonrc):
           __builtins__.__dict__[attr] = getattr(pythonrc, attr)

       sys.path.remove(os.sep.join(myPythonPath[:-1]))
       del sys, os, pythonrc

Обратите внимание, что это довольно хакерский и я никогда сделайте это, не убедившись, что мой pythonrc не случайно забивает переменные и встроенные функции.

0 голосов
/ 18 ноября 2015

В дополнение к ответам Чинмая Канчи и Грега Хьюгилла, я хотел бы добавить, что IPython и BPython работают нормально в этом случае.Возможно, вам пора переключиться?:)

0 голосов
/ 24 ноября 2011

Очевидно, пользовательский модуль обеспечивает это, но был удален в Python 3.0. Это немного дыра в безопасности, в зависимости от того, что находится в вашем pythonrc ...

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