Почему не запускается скомпилированная программа

почему Python компилирует библиотеки, которые используются в скрипте,но не сам скрипт?

если есть main.py и module.py , и Python запускается путем выполнения python main.py , будет скомпилированный файл module.pyc но не один для main. Почему?

редактировать

добавление баунти. Я не думаю, что на это был правильный ответ.

  1. если ответ потенциальный диск разрешения для каталога main.py , Почему Python компилирует модули? Они так же вероятны (если не более вероятны), чтобы появиться в месте, где пользователь не имеет доступа на запись. Python может компилировать main если он доступен для записи, или же в другой каталог.
  2. если причина в том, что пособия будут минимальными, рассмотрим ситуацию, когда скрипт будет использоваться большое количество раз (например, в приложение CGI).

автор: Mike

6 ответов

файлы компилируются при импорте. Это не вопрос безопасности. Просто, если вы импортируете его, python сохраняет вывод. См.этот пост Фредрик Lundhбыл на Effbot.

Что делать есть не запускается setup.exe когда скачиваешь игры


>>>import main # main.pyc is created

при запуске скрипта python будет не использовать *.файл pyc. Если у вас есть другая причина, по которой вы хотите, чтобы ваш сценарий был предварительно скомпилирован, вы можете использовать compileall модуль.

python -m compileall .

использование compileall

python -m compileall —help option —help not recognized usage: python compileall.py [-l] [-f] [-q] [-d destdir] [-x regexp] [directory . ] -l: don’t recurse down -f: force rebuild even if timestamps are up-to-date -q: quiet operation -d destdir: purported directory name for error messages if no directory arguments, -l sys.path is assumed -x regexp: skip files matching the regular expression regexp the regexp is searched for in the full path of the file

ответы на Вопрос Редактировать

если ответ является потенциальными разрешениями диска для каталога main.py , Почему Python компилирует модули?

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

Гленн Мейнард предоставил вдохновение, чтобы исправить и улучшить этот ответ.

автор: kevpie

никто, кажется, не хочет этого говорить, но я уверен, что ответ прост: нет никакой веской причины для такого поведения.

все приведенные до сих пор причины по существу неверны:

  • в главном файле нет ничего особенного. Он загружен как модуль, и в sys.modules как и любой другой модуль. Запуск основного скрипта — это не что иное, как импорт его с именем модуля __main__ .
  • нет проблем с невозможностью сохранения .pyc файлы из-за только для чтения каталогов; Python просто игнорирует его и движется дальше.
  • преимущество кэширования скрипта такое же, как и у кэширования любого модуля: не тратить время на перекомпиляцию скрипта каждый раз, когда он запускается. Врачи признают это явно («таким образом, время запуска скрипта может быть уменьшен . «).

еще одна проблема: если вы запустите python foo.py и Foo.ЧКД существует, это не будет использовать. Ты должен явно сказать python foo.pyc . Это очень плохая идея: это означает, что Python не будет автоматически перекомпилировать .pyc-файл, когда он не синхронизирован (из-за .py файл меняется), поэтому изменяется на .файл py не будет использоваться, пока вы не перекомпилируете его вручную. Он также потерпит неудачу с RuntimeError, если вы обновите Python и.формат файла pyc больше не совместим, что происходит регулярно. Обычно все происходит прозрачно.

Если программа не запускается

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

Читайте также:
Masters программа для записи клиентов отзывы

единственная возможная (и очень неубедительная) причина, которую я могу придумать, — это избежать того, чтобы ваш домашний каталог был загроможден кучей .файлы pyc. (Это не настоящая причина; если это действительно было проблемой, то .файлы pyc должны быть сохранены как dotfiles.) Это, конечно, не причина, чтобы даже не иметь опции для этого.

Python должны определенно можно кэшировать основной модуль.

автор: Glenn Maynard

педагогика

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

многие технические вопросы на SO имеют по крайней мере один окончательный ответ (например, ответ, который может быть проверен путем выполнения или ответ, который цитирует авторитетный источник), но эти «почему» вопросы часто не имеют единственного, окончательного ответа. На мой взгляд, есть 2 возможных способа окончательно ответить на вопрос» почему » в информатике:

  1. , указывая на исходный код, который реализует элемент беспокойства. Это объясняет «почему» в техническом смысле: какие предпосылки необходимы, чтобы вызвать такое поведение?
  2. указывая на читаемые человеком артефакты (комментарии, сообщения фиксации, списки электронной почты, так далее.) написано разработчиками, участвующими в принятии этого решения. Это реальный смысл «Почему», который я предполагаю, что OP заинтересован: почему разработчики Python приняли это, казалось бы, произвольное решение?

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

на сегодняшний день, это thread имеет 7 ответов, которые сосредоточены исключительно на чтении намерений разработчиков Python, и все же есть только ссылка во всей партии. (И он ссылается на раздел руководства Python, который делает не ответьте на вопрос OP.)

вот моя попытка решения и сторон вопроса «почему» вместе с цитатами.

Исходный Код

каковы предпосылки, инициирующие составление .ЧКД? Давайте посмотрим на исходный код. (Досадно, что у Python на GitHub нет тегов выпуска, поэтому я просто скажу вам, что я смотрю на 715a6e .)

есть многообещающий код в import.c:989 на . Я вырезал несколько кусочков для краткости.

static PyObject * load_source_module(char *name, char *pathname, FILE *fp) < // snip. if (/* Can we read a .pyc file? */) < /* Then use the .pyc file. */ >else < co = parse_source_module(pathname, fp); if (co == NULL) return NULL; if (Py_VerboseFlag) PySys_WriteStderr(«import %s # from %sn», name, pathname); if (cpathname) < PyObject *ro = PySys_GetObject(«dont_write_bytecode»); if (ro == NULL || !PyObject_IsTrue(ro)) write_compiled_module(co, cpathname, >> m = PyImport_ExecCodeModuleEx(name, (PyObject *)co, pathname); Py_DECREF(co); return m; >

pathname — это путь к модулю и cpathname тот же путь, но с a .расширением pyc. Единственная прямая логика-это boolean sys.dont_write_bytecode . Остальные логика-это просто обработка ошибок. Поэтому ответ мы ищем, здесь нет, но мы можем по крайней мере видеть, что любой код, который вызывает это приведет .файл pyc в большинстве конфигураций по умолчанию. The parse_source_module() функция не имеет реального отношения к потоку выполнения, но я покажу ее здесь, потому что я вернусь к ней позже.

static PyCodeObject * parse_source_module(const char *pathname, FILE *fp) < PyCodeObject *co = NULL; mod_ty mod; PyCompilerFlags flags; PyArena *arena = PyArena_New(); if (arena == NULL) return NULL; flags.cf_flags = 0; mod = PyParser_ASTFromFile(fp, pathname, Py_file_input, 0, 0, if (mod) < co = PyAST_Compile(mod, pathname, NULL, arena); >PyArena_Free(arena); return co; >

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

Читайте также:
Какой тег должен открывать html программу а какой закрывать ее

теперь мы все еще в тупике, поэтому давайте подойдем к этому под новым углом. Как Python загружает свой аргумент и выполняет его? В pythonrun.c есть несколько функций для загрузки кода из файла и его выполнения. PyRun_AnyFileExFlags() может обрабатывать как интерактивные, так и неинтерактивные файловые дескрипторы. Для интерактивных дескрипторов файлов он делегирует значение PyRun_InteractiveLoopFlags() (это REPL) и для неинтерактивных файловых дескрипторов он делегирует PyRun_SimpleFileExFlags() . PyRun_SimpleFileExFlags() проверяет, заканчивается ли имя файла на .pyc . Если это так, то это звонки run_pyc_file() который напрямую загружает скомпилированный байтовый код из файлового дескриптора, а затем запускает его.

в более общем случае (т. е. в качестве аргумента), PyRun_SimpleFileExFlags() звонки PyRun_FileExFlags() . Здесь мы начинаем искать ответ.

PyObject * PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit, PyCompilerFlags *flags) < PyObject *ret; mod_ty mod; PyArena *arena = PyArena_New(); if (arena == NULL) return NULL; mod = PyParser_ASTFromFile(fp, filename, start, 0, 0, flags, NULL, arena); if (closeit) fclose(fp); if (mod == NULL) < PyArena_Free(arena); return NULL; >ret = run_mod(mod, filename, globals, locals, flags, arena); PyArena_Free(arena); return ret; > static PyObject * run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals, PyCompilerFlags *flags, PyArena *arena)

характерным моментом здесь является то, что эти две функции в основном выполняют ту же цель, что и импортер load_source_module() и parse_source_module() . Он вызывает синтаксический анализатор для создания AST из исходного кода Python, а затем вызывает компилятор создать байт-код.

Итак, эти блоки кода избыточны или они служат разным целям? Разница в том, что один блок загружает модуль из файла, а другой блок принимает модуль в качестве аргумента. Этот аргумент модуля — в данном случае — __main__ модуль, который создается ранее в процессе инициализации с помощью низкоуровневой функции C. The __main__ модуль не проходит через большинство обычных путей импорта кода модуля, потому что это так уникальный, и как побочный эффект, он не проходит через код, который производит .pyc файлы.

подводя итог: причина, почему __main__ модуль не компилируется .pyc заключается в том, что он не «импортируется». Да, он появляется в sys.модули, но он попадает туда через совсем другой путь кода, чем реальный импорт модулей.

Разработчик Намерениях

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

одна из ключевых строк кода здесь ( m = PyImport_AddModule(«__main__»); ) восходит к 1990 году написано самим БДФЛ, Гвидо. За прошедшие годы она была видоизменена, но изменения поверхностны. Когда он был впервые написан, основной модуль для аргумента скрипта был инициализирован следующим образом:

int run_script(fp, filename) FILE *fp; char *filename; < object *m, *d, *v; m = add_module(«`__main__`»); if (m == NULL) return -1; d = getmoduledict(m); v = run_file(fp, filename, file_input, d, d); flushline(); if (v == NULL) < print_error(); return -1; >DECREF(v); return 0; >

это существовало перед .pyc файлы были даже введены в Python! Неудивительно, что дизайн в то время не учитывал компиляцию для Аргументов скрипта. The фиксация загадочно говорит:

это был один из нескольких десятков коммитов в течение 3 дней. похоже, что Гвидо был глубоко в некотором взломе / рефакторинге, и это была первая версия, которая вернулась к стабильности. Эта фиксация даже предшествует созданию список рассылки Python-Dev около пяти лет!

Читайте также:
Программа обеспечения безопасности пример

сохранение скомпилированного байт-кода было введено 6 месяцев спустя, в 1991 году.

это еще раньше список служит, поэтому мы не имеем никакого представления о том, что думал Гвидо. Похоже, он просто думал, что импортер был лучшим местом для подключения с целью кэширования байт-кодов. Считает ли он идею сделать то же самое для

я не могу найти какие-либо ошибки ВКЛ bugs.python.org которые связаны с кэшированием байт-кодов для main модуль, и я не могу найти никаких сообщений в списке рассылки об этом, поэтому, по-видимому, никто больше не думает, что стоит попробовать добавить его.

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

ответ Гленна Мейнарда гласит:

согласен на 100%. Есть косвенные доказательства, подтверждающие эту теорию, и никто в этом потоке не предоставил ни единого доказательства, подтверждающего любую другую теорию. Я поддержала ответ Гленна.

Источник: askdev.ru

Не открывается exe файл после компиляции gcc. Что делать?

Не открывается exe файл после компиляции gcc. Проект написан на языке C. Открывается в cmd и powershell, но при обычном запуске ничего не происходит.

  • Вопрос задан 10 мая
  • 110 просмотров

1 комментарий

Простой 1 комментарий

2ord

ну так и открывай в cmd или powershell . В чём вопрос?
Решения вопроса 1

2ord

Консольная программа (которая не имеет графического интерфейса как Calculator) может работать только в сеансе терминала. Для этого нужно открыть cmd или powershell.
Если запускать вне терминала (с Рабочего стола), то программа запустится и очень быстро закроется, поскольку она выполняет свою задачу и сразу завершается. Чтобы увидеть результаты работы (какой-то вывод на экран), нужно вставить действие для ожидания от пользователя, допустим getch();
И не забыть инклюды

Источник: qna.habr.com

Решение проблем, возникающих при выполнении команд ./configure, make и make install

Очевидно, что ошибки при выполнении команды ./configure, возникают во время выполнения скрипта конфигурации, ошибки при выполнении команды make возникают во время выполнения команды make, а ошибки при выполнении команды make install, соответственно, возникают при выполнении команды make install. Далее будет представлен лист типичных ошибок и способ их решения, разделенный на эти три категории.

Ошибки при выполнении команды ./configure

Следующий список содержит некоторые общие ошибки, которые может выдать каманда ./configure. Ошибки отсортированы по частоте возникновения. Сначала наиболее часто встречающиеся. Вещи между ( и ) являются опциональными, они могут не появлятся. OR, выделенное жирным курсивом означает, что несколько ошибок имеют одно решение.

Текст между < и >показывает тип строки, которая должна появиться в этом месте.

Ошибки при выполнении команды make

Ошибки при выполнении команды make install

Эти ошибки обычно легко понять, но я все равно про них напишу. Есть два наиболее частых случая, почему команда make install возвращает ошибку:

Другие проблемы

Вот список некоторых других возможных проблем и их решения:

Финальные слова

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

В любом случае, я надеюсь эта статья будет полезна для вас. Спасибо за прочтение и удачи в сложной, но увлекательной вещи, которая называется компиляция!

Источник: www.ylsoftware.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru