Я хочу динамически преобразовать файл python в файл .exe. Я уже пытался использовать auto-py-to-exe, но это связано с использованием графического интерфейса и не требует программного преобразования файла.
Взяв пример кода, представленного ниже, я хочу преобразовать файл second.py в файл .exe, используя только код и без каких-либо ручных действий.
first.py -:
import os
code = """
print(hello world)
"""
with open("second.py", "w") as second_file:
second_file.write(code)
convert_to_exe('second.py') # Yet not clear, on how to achieve this.
почему я задаю вопрос, если я могу ответить на него в первую очередь
Дело не в том, чтобы ответить на вопрос, а в том, чтобы заранее провести соответствующее исследование, прежде чем задавать вопрос. В отличие от других веб-форумов, на Stack Overflow есть одно из правил задавать вопросы: «Исследуй, прежде чем спрашивать». Если вы даже не пытались найти решение этой проблемы где-либо еще в Интернете, то, скорее всего, она может быть решена и уже решена, и вы заполняете веб-сайт ненужным новым вопросом. Конечно, мы все здесь, чтобы помогать друг другу, но только тогда, когда помощь действительно нужна и другого источника информации нет.
Если бы у вас был вопрос относительно чего-то очень простого, что можно было найти где угодно в Интернете, а кто-то другой на следующий день задал бы тот же вопрос, поскольку у него были бы такие же сомнения, сайт был бы заполнен повторяющимися вопросами. Этот сайт был создан специально для того, чтобы обеспечить надежное хранилище всех знаний по программированию для программистов, чтобы они могли использовать их всякий раз, когда они сталкиваются с проблемой, но задают вопрос, на который уже был дан ответ во многих других местах в Интернете, и его можно легко найти с помощью некоторых исследований. является избыточным. Кроме того, все это является частью правил сайта.
да, я на самом деле пытаюсь найти решение часами, я просто не мог найти нужное мне решение
О, я вижу, было бы полезно решить проблему, если бы вы могли связать источники, которые вы посетили, чтобы попытаться найти решение этой проблемы. :D
сделать, вызвать, сделать?
@rasjani извините, я не понимаю, что вы имели в виду
@PrisonMike Вы изучали cx_freeze? Также можете ли вы точно указать, каким образом вы ожидаете программно/динамически создать exe? Каковы будут ваши конфигурации для него? Как он узнает, какой файл выбрать и откуда?
@typedecker, пожалуйста, посмотрите отредактированный вопрос...
@PrisonMike Хорошо, если вы исследовали эту область, вы, должно быть, заметили, что каждая программа имеет различную конфигурацию и зависит от модулей, методов и многих других обстоятельств, используемых файлов и зависимостей, а также типа требуемого файла .exe. , способ создания исполняемого файла может отличаться. В основном создание исполняемого файла включает в себя Freezing используемых сценариев, и для этой цели программа должна быть снабжена всеми зависимостями. Один из способов добиться этого — использовать cx_freeze , docs
@typedecker хорошо, спасибо, я проведу больше исследований по этому вопросу






Не существует одного очень чистого способа создать исполняемый файл на python, но вы можете объединить две библиотеки, чтобы выполнить работу:
Вы можете использовать subprocess.run('pyinstaller', '--onefile', 'pythonScriptName.py'), чтобы получить нужную вам функциональность.
Вы можете ознакомиться с документацией pyinstaller, чтобы добавить дополнительные аргументы в команду.
Добавив это, ваша программа будет выглядеть так:
import os
import subprocess
code = """
print(hello world)
"""
with open("second.py", "w") as second_file:
second_file.write(code)
subprocess.run('pyinstaller', '--onefile', 'secondfile.py')
Вы также можете использовать библиотеку подпроцессов для запуска этого недавно созданного исполняемого файла, если это то, что вы ищете.
Глядя на вопрос и основываясь на разговоре, который у меня был в комментариях, кажется, что цель здесь - создать exe динамически/программно (полностью используя код). Есть много способов добиться этого, один из них — использование модуля cx_freeze.
Используя этот модуль, вы можете написать сценарий установки для exe, а затем использовать команду для сборки exe -:
import sys
from cx_Freeze import setup, Executable
# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {
"excludes": ["tkinter", "unittest"],
"zip_include_packages": ["encodings", "PySide6"],
}
# base = "Win32GUI" should be used only for Windows GUI app
base = "Win32GUI" if sys.platform == "win32" else None
setup(
name = "guifoo",
version = "0.1",
description = "My GUI application!",
options = {"build_exe": build_exe_options},
executables=[Executable("guifoo.py", base=base)],
)
Сборка exe -:
python setup.py build
Результат выполнения этой команды описан в документации следующим образом:
Эта команда создаст подкаталог build с дополнительным подкаталогом, начинающимся с букв exe. и заканчивая типичным идентификатором платформы и версии Python. Это позволяет создавать несколько платформ без конфликтов.
Кроме того, если вы хотите создать исполняемый файл полностью с использованием кода без какой-либо отдельной ручной работы, конфигурации все равно должны быть установлены, но кроме этого вы можете использовать метод subprocess модуля call с shell = True в качестве аргумента для запуска команды -line также программно. Примерно так -:
import subprocess
def create_exe(code, excludes, zip_include_packages, name, version, description) :
with open('source_for_exe_file.py', 'w') as f :
f.write(code)
setup_script = 'import sys\nfrom cx_Freeze import setup, Executable\n# Dependencies are automatically detected, but it might need fine tuning.\nbuild_exe_options = {"excludes" : {excludes}, "zip_include_packages" : {zip_include_packages},}\n# base = "Win32GUI" should be used only for Windows GUI app\nbase = "Win32GUI" if sys.platform == "win32" else None\nsetup(name = {name}, version = {version}, description = {description}, options = {"build_exe" : build_exe_options}, executables = [Executable("source_for_exe.py", base = base)],)'.format(excludes = excludes, zip_include_packages = zip_include_packages, name = name, version = version, description = description)
with open('setup.py', 'w') as f :
f.write(setup_script)
result = subprocess.call('python setup.py build', shell = True)
return result # Just returning any command line output.
Обратите внимание, что предоставленный код не тестировался, и поэтому его надлежащая функциональность неясна, учитывая отсутствие надлежащего объяснения того, какой код можно ожидать. Также обратите внимание, что результатом этой функции будет создание исполняемого файла в подпапке папки сборки, как указано в первом подходе. Единственная разница здесь в том, что ручное выполнение команды не использовалось.
Кроме того, как упоминалось ранее в ответе, существует несколько других способов добиться того же, один из таких способов - использовать pyinstaller следующим образом:
import PyInstaller.__main__
PyInstaller.__main__.run([
'second.py',
'--onefile',
'--windowed'
])
Обратите внимание, что это было частично взято из документов, с единственной модификацией, заключающейся в изменении имени файла, но это жизнеспособный и более упрощенный подход, если игнорировать сложные различия.
Кроме того, поскольку в вопросе упоминался py2exe, я бы посоветовал взглянуть на этот источник. Это учебник по созданию исполняемого файла с использованием сценария установки, аналогичного cx_freeze подходу, продемонстрированному выше, но с преимуществом простоты. Однако я должен упомянуть, что учебник, похоже, был написан для python 2.0, и любые изменения в методе, описанном в нем, могут привести к тому, что он не будет работать для python 3.0.
Вы пытались решить проблему самостоятельно? На какие источники вы ссылались, прежде чем задать этот вопрос? Пожалуйста, прочитайте Как спросить