2010-11-09 6 views
2

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

python 
Loading pythonrc 
>>> 

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

python -i script.py 
>>> 

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

ответ

3

С Python documentation for -i:

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

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

+0

Спасибо. Я понимаю, что это хорошее поведение по умолчанию, но хотелось бы знать, можно ли его обойти. Полагаю, я могу просто добавить execfile ("~/.pythonrc") в мои скрипты. – invisiblerhino

+0

@invisiblerhino: он работает с '' 'для вас? – d33tah

1

Как отметил Грег, есть очень веская причина, по которой -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 

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

+0

Примечание: не будет работать, если ваш файл Python начинается с символа '.' например '.pythonrc' – bcoughlan

0

По-видимому, это user module, но был удален в Python 3.0. Это немного дыры в безопасности, в зависимости от того, что находится в вашем pythonrc ...

0

В дополнение к ответам Chinmay Kanchi и Greg Hewgill, я хотел бы добавить, что в этом случае IPython и BPython работают нормально. Возможно, вам пора переключаться? :)

Смежные вопросы