Попытка заставить PLY работать впервые

Я новичок в Python и у меня возникли некоторые проблемы, пытаясь заставить PLY работать. Пока все, что я хочу - это успешно запустить пример с домашней страницы PLY.

Сначала я попытался просто загрузить PLY-3.8, поместить папку ply в ту же директорию, в которой я сохранил пример (calc.py), и запустить его. Файл calc.py находится в каталоге C:\Users\...\Python, а папка ply - в C:\Users\...\Python \ ply, чтобы сделать его более понятным. Но я получил ImportError: No module named 'ply',

Затем я некоторое время искал, пытался обновить что-то, называемое distutils, и устанавливать модули через Windows PowerShell и так далее, и тому подобное, но ничего из этого не сработало, и я просто сбросил все это (переустановив Python и все такое). Но затем я, наконец, заставил его работать, просто вставив в sys.path путь к каталогу, где находился скрипт, который я запускал (edit: в интерактивном режиме), выполнив следующее:

import sys
sys.path.insert(0,'C:\\Users\\ ... \\Python')

Это исправило ошибку ImportError, но сейчас я нахожусь в куче других ошибок:

Traceback (most recent call last):
  File "C:\Users\...\Python\calc.py", line 48, in <module>
    lexer = lex.lex()
  File "C:\Users\...\Python\ply\lex.py", line 906, in lex
    if linfo.validate_all():
  File "C:\Users\...\Python\ply\lex.py", line 580, in validate_all
    self.validate_rules()
  File "C:\Users\...\Python\ply\lex.py", line 822, in validate_rules
    self.validate_module(module)
  File "C:\Users\...\Python\ply\lex.py", line 833, in validate_module
    lines, linen = inspect.getsourcelines(module)
  File "c:\users\...\python\python35\lib\inspect.py", line 930, in getsourcelines
    lines, lnum = findsource(object)
  File "c:\users\...\python\python35\lib\inspect.py", line 743, in findsource
    file = getsourcefile(object)
  File "c:\users\...\python\python35\lib\inspect.py", line 659, in getsourcefile
    filename = getfile(object)
  File "c:\users\...\python\python35\lib\inspect.py", line 606, in getfile
    raise TypeError('{!r} is a built-in module'.format(object))
TypeError: <module '__main__'> is a built-in module

Теперь я абсолютно не знаю, что делать. Я пытался найти решение, но безуспешно. Я ценю, если кто-нибудь может мне помочь.

Я использую Windows 10, использую Python 3.5.0 и iep в качестве своей IDE (www.iep-project.org), если эта информация имеет какое-либо значение.

Короче говоря: я просто хочу успешно запустить пример с домашней страницы PLY, а потом думаю, что смогу выяснить все остальное.

РЕДАКТИРОВАТЬ: Я узнал, что если я делаю:

import inspect
inspect.getfile(__main__)

Я получаю точно такую ​​же (последнюю) ошибку из ранее:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "c:\users\...\python\python35\lib\inspect.py", line 606, in getfile
    raise TypeError('{!r} is a built-in module'.format(object))
TypeError: <module '__main__'> is a built-in module

Я думаю, что это виновник, но я все еще не знаю, как это исправить.

РЕДАКТИРОВАТЬ 2: Я получил его на работу и ответил на вопрос, объясняющий, как, но если у кого-то есть более полный ответ, я хотел бы услышать это.

1 ответ

Решение

Для тех, кто имеет эту проблему, я нашел, в чем проблема. Я до сих пор не знаю, почему именно так, поэтому, если у кого-то есть более полный ответ, я буду признателен (я все еще новичок в Python).

В любом случае, кажется, что этот код не может быть выполнен в интерактивном режиме, его нужно выполнять как скрипт. Для этого в IEP это Run > Run file as script или Ctrl + Shift + E. В режиме IDLE необходимо открыть... файл (Ctrl + O), а затем запустить модуль (F5).

Что касается того, почему он не может быть выполнен в интерактивном режиме, вот немного о разнице между интерактивным режимом и выполнением в виде скрипта из мастера IEP:

Интерактивный режим против запуска как скрипт

Вы можете запустить текущий файл или основной файл как обычно, или как скрипт. При запуске в качестве сценария оболочка восстанавливается (sic), чтобы обеспечить чистую среду. Оболочка также инициализируется по-разному, так что она очень похожа на обычное выполнение скрипта.

В интерактивном режиме sys.path[0] является пустой строкой (то есть текущим каталогом), а sys.argv имеет значение [''].

В режиме сценария для __file__ и sys.argv[0] задано имя файла сценария, для sys.path[0] и рабочего каталога указан каталог, содержащий сценарий.

Это немного объясняет, почему inspect.getfile(__main__) выдавал ошибку: у __main__ не было атрибута __file__. А также, почему мне пришлось вставить текущий каталог в sys.path: у sys.path не было текущего каталога в интерактивном режиме.

Я надеюсь, что это помогает кому-то.

Другие вопросы по тегам