2013-12-10 2 views
1

Я понял, что после компиляции скрипта python он исправляет информацию о пути этого скрипта.Путь скрипта python остается таким же после компиляции

Например: У меня есть питон скрипт как /tmp/src/foo.py, который имеет одну команду печати

print foo 

Теперь я компиляцией этот код и переместить его в скомпилированный каталог.

python -m compileall -f /tmp/src/foo.py 
mv /tmp/src/foo.pyc /tmp/compiled/ 

Тогда я бегу сценарий и он дает ошибку, как я excepts

python /tmp/compiled/foo.pyc 
Traceback (most recent call last): 
    File "/tmp/src/foo.py", line 1, in <module> # focus heree 
    print foo 
NameError: name 'foo' is not defined 

Как вы понимаете, имя файла сценария появились по ошибке, как его имя до компиляции. (Точно так же, как путь, который я даю команде компиляции)

На самом деле у меня нет проблем с этой ситуацией, я спрашиваю, потому что мне просто интересно. В чем причина и есть ли способ увидеть реальный путь в ошибках?

На мой взгляд, мы не могли изменить двоичный файл, но, возможно, мы можем указать параметр командной строки на python при запуске скомпилированного кода или, возможно, мы можем добавить сегмент кода в исходный код?

Благодаря

+0

Что вы подразумеваете под «есть ли способ увидеть реальный путь в ошибках?»? Вы уже видите реальный путь? Что вы хотите увидеть там? –

+2

Почему вы хотите вручную «скомпилировать» сценарий и почему вы можете поместить его в другой каталог? – smeso

+0

@ Forbidden Overseer Я вижу исходный путь. Я хочу увидеть путь скомпилированного кода. – ibrahim

ответ

1

Ваш вопрос исходит из того, что скомпилированная версия модуля Python может и должна быть перемещена в определенных условиях. Я никогда не слышал об этом раньше, поэтому пока не покажу спецификацию, которая одобряет такую ​​вещь, я бы сказал, что это злоупотребление, и вам повезло, что вы можете вообще запустить файл .pyc без .py на его стороне.

Если вы думаете о .pyc файлах как простые кэша скомпилированных версий оригинала, то вы можете легко объяснить все явления вы наблюдали: Путь исходного .py файла хранится в .pyc вместе с всем остальным идет от этот источник. Если перемещено, это содержимое, конечно, останется прежним и будет использоваться в сообщениях об ошибках.

Существует нет способ увидеть «реальный» путь в сообщении об ошибке, потому что место файла .pyc больше не известно после его загрузки; учитывается только его содержимое, а не его местоположение, потому что объединение этих двух вещей является шагом компиляции. Интерпретатор не скомпилирует ничего с уже скомпилированным модулем. Он принимает это как есть.

Патч .pyc Файл, отображающий другой путь, также не имеет смысла, потому что это сообщение помогает вам отладить проблему. Вероятно, вы не будете отлаживать что-либо в файле .pyc, но только в файле .py. Поэтому представляется целесообразным скорее указать путь к этому файлу в сообщении об ошибке.

+0

Я могу запустить .pyc без .py даже на других машинах, даже это длинный скрипт. – ibrahim

+0

Итак? Это просто потому, что байт-код везде одинаковый. – Alfe

+0

Я хотел указать, что, поскольку вы сказали: «Вам повезло, что вы можете запускать файл .pyc вообще без .py на своей стороне». – ibrahim

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