Попытка заставить 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 не было текущего каталога в интерактивном режиме.
Я надеюсь, что это помогает кому-то.