Найти - Пользователи
Полная версия: Проблема. Запуск EXE-файла из скрипта
Начало » Python для новичков » Проблема. Запуск EXE-файла из скрипта
1 2
saw_tooth
Доброго времени суток форумчане.

Проблема такова, есть программка Python под Win отлаженная скомпилированная в ехе.
В программе есть кнопка запуска другой, сторонней программы ЕХЕ (далее просто ЕХЕшник) не питоньей.
Для запуска второй программы, нужны рядом лежащие конфиг файлы.

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

Иными словами, моя программа дает управление ЕХЕшнику из под своей папки, и при запуске он не видит свои конфиги, что лежат рядом. (это как понял я)

Вот код:
def start_system():
way_dir = path.normpath(path.join(getcwd(), ‘..’))
system(way_dir + ‘\\blablabla.exe’)
sys.exit(0)

Первая строка поднимает рабочий каталог вверх на одну папку
Вторая собственно открывает файл

Пробовал по разному, и юзать startfile, subprocess результат тот же. ЕХЕшник вылетает с ексепшином не найден файл.

Если, в рабочую папку скрипта (питон-программы) положить конфиги - все ок, но это не выход.

Кто может, подскажите. Заранее спасибо.

doza_and
Я так понимаю ось винда. Как запускаете программу? Если будете просто тыкать мышкой могут быть всякие чудеса.

saw_tooth
Первая строка поднимает рабочий каталог вверх на одну папку
Вот это не верно. Для изменения текущей директории (того места где программа по умолчанию ищет файлы) используйте chdir. Вы же просто формируете строку с полным именем программы.
py.user.next
saw_tooth
Если, в рабочую папку скрипта (питон-программы) положить конфиги - все ок
Вторая программа криво написана. Конфиги должны искаться в месте расположения программы.
saw_tooth
doza_and
Я так понимаю ось винда. Как запускаете программу? Если будете просто тыкать мышкой могут быть всякие чудеса.
Извините, может покажусь ламером. Могли бы вы подробнее описать как работать с этой функцией chdir, в туторе пусто, на иных примерах не понял, хотя обращал внимание на него.

py.user.next

Не исключено что она кривая, я в этом уверен, но суть в другом. Скрипт, когда запускает ЕХЕшник, говорит ему о его положении как я понял, и вот оно не совпадает с настоящим, поэтому ЕХЕ не видит свои файлы.





doza_and
import os
os.chdir(r"c:\dirof\prog")
saw_tooth
doza_and

Опять нубский вопрос, у меня не статический путь, скрипт будет исполнятся на различных компах

Изменить в вашем коде путь на getcwd()?
doza_and
getcwd неправильно использовать. Какое отношение имеет текущая директория к расположению вашего исполняемого модуля? Скрипт легко может быть запущен (и как правило запускается) не из той папки где он лежит.

Надо или из конфигурационного файла читать ее расположение
Или брать папку в которой расположен скрипт (если вы их всегда будете рядом располагать).
Если не ищете сложностей то рекомендую “unix way” напишите скрипт который будет ставить ваше хозяйство в предопределенную папку (глобально или в home пользователя). Тогда будете получать путь так:
import os
hd=os.environ["HOME"]
path=os.path.join([hd,"my_prog_folder/a.exe"])

Правильный пусть написать инсталлятор для ваших 2 файлов, сделать дистрибутив
и дальше получать путь при помощи:
import pkg_resources
my_executable = pkg_resources.resource_string("you_pack_name", "foo.exe")
Чтобы в этом разобраться надо прочитать
https://docs.python.org/2/distutils/
https://pythonhosted.org/setuptools/easy_install.html
http://pip.readthedocs.org/en/latest/installing.html

Простой путь - получить имя файла содержащего ваш модуль и прилепить к нему имя программы.
Извините может поначалу это покажется не очень просто.
saw_tooth
Да, весьма тяжеловато дается.

Попробую так.

Есть такой путь:
С:\test\program - тут ЕХЕшник
C:\test\program\script - тут питончик (оговорюсь, скрипт скомпилирован в ЕХЕ с помощью cx_Freezy)

Вот скрип и запускает ЕХЕ файл. Программы независимы и нельзя их передавать в обобщеном виде.
так вот в зависимости от компов, кусок пути /test/ может варьироваться, и не всегда постоянный, поэтому я и пытался получить путь рабочей папки, что бы потом передать его на путь запуска ЕХЕшника.

doza_and, может черкните скайп, пообщаемся)

UPD. Что то управление на форуме противоречит нормальному смыслу.
UPD2. Мой контакт соответствует нику




py.user.next
saw_tooth
Не исключено что она кривая, я в этом уверен, но суть в другом. Скрипт, когда запускает ЕХЕшник, говорит ему о его положении как я понял, и вот оно не совпадает с настоящим, поэтому ЕХЕ не видит свои файлы.
Вторая программа неправильно определяет путь для своих конфигов. Независимо от способа запуска она должна находить свои конфиги там, где они находятся.

А пока делай os.chdir() в запускающем скрипте в то место, где находится запускаемая программа. Хотя лучше отослать вторую программу её создателю.
doza_and
import sys,os
import subprocess as sp
cwd=os.getcwd()
os.chdir(os.path.join(os.path.dirname(sys.argv[0]),".."))
sp.check_call("x.exe")
cwd=os.chdir(cwd)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB