Форум сайта python.su
0
Доброго времени суток форумчане.
Проблема такова, есть программка Python под Win отлаженная скомпилированная в ехе.
В программе есть кнопка запуска другой, сторонней программы ЕХЕ (далее просто ЕХЕшник) не питоньей.
Для запуска второй программы, нужны рядом лежащие конфиг файлы.
Суть проблемы такова. Если просто запускать программу из под системы - никаких проблем, как только я пытаюсь запустить ЕХЕ из под моей программы, вторая крашится, а сообщение говорит о том что не найдены файлы конфигурации.
Иными словами, моя программа дает управление ЕХЕшнику из под своей папки, и при запуске он не видит свои конфиги, что лежат рядом. (это как понял я)
Вот код:
def start_system():
way_dir = path.normpath(path.join(getcwd(), ‘..’))
system(way_dir + ‘\\blablabla.exe’)
sys.exit(0)
Первая строка поднимает рабочий каталог вверх на одну папку
Вторая собственно открывает файл
Пробовал по разному, и юзать startfile, subprocess результат тот же. ЕХЕшник вылетает с ексепшином не найден файл.
Если, в рабочую папку скрипта (питон-программы) положить конфиги - все ок, но это не выход.
Кто может, подскажите. Заранее спасибо.
Офлайн
253
Я так понимаю ось винда. Как запускаете программу? Если будете просто тыкать мышкой могут быть всякие чудеса.
saw_toothВот это не верно. Для изменения текущей директории (того места где программа по умолчанию ищет файлы) используйте chdir. Вы же просто формируете строку с полным именем программы.
Первая строка поднимает рабочий каталог вверх на одну папку
Офлайн
857
saw_toothВторая программа криво написана. Конфиги должны искаться в месте расположения программы.
Если, в рабочую папку скрипта (питон-программы) положить конфиги - все ок
Отредактировано py.user.next (Ноя. 3, 2014 01:00:27)
Офлайн
0
doza_andИзвините, может покажусь ламером. Могли бы вы подробнее описать как работать с этой функцией chdir, в туторе пусто, на иных примерах не понял, хотя обращал внимание на него.
Я так понимаю ось винда. Как запускаете программу? Если будете просто тыкать мышкой могут быть всякие чудеса.
py.user.next
Офлайн
253
import os os.chdir(r"c:\dirof\prog")
Офлайн
0
doza_and
Офлайн
253
getcwd неправильно использовать. Какое отношение имеет текущая директория к расположению вашего исполняемого модуля? Скрипт легко может быть запущен (и как правило запускается) не из той папки где он лежит.
Надо или из конфигурационного файла читать ее расположение
Или брать папку в которой расположен скрипт (если вы их всегда будете рядом располагать).
Если не ищете сложностей то рекомендую “unix way” напишите скрипт который будет ставить ваше хозяйство в предопределенную папку (глобально или в home пользователя). Тогда будете получать путь так:
import os hd=os.environ["HOME"] path=os.path.join([hd,"my_prog_folder/a.exe"])
import pkg_resources my_executable = pkg_resources.resource_string("you_pack_name", "foo.exe")
Отредактировано doza_and (Ноя. 3, 2014 15:31:43)
Офлайн
0
Да, весьма тяжеловато дается.
Попробую так.
Есть такой путь:
С:\test\program - тут ЕХЕшник
C:\test\program\script - тут питончик (оговорюсь, скрипт скомпилирован в ЕХЕ с помощью cx_Freezy)
Вот скрип и запускает ЕХЕ файл. Программы независимы и нельзя их передавать в обобщеном виде.
так вот в зависимости от компов, кусок пути /test/ может варьироваться, и не всегда постоянный, поэтому я и пытался получить путь рабочей папки, что бы потом передать его на путь запуска ЕХЕшника.
doza_and, может черкните скайп, пообщаемся)
UPD. Что то управление на форуме противоречит нормальному смыслу.
UPD2. Мой контакт соответствует нику
Отредактировано saw_tooth (Ноя. 3, 2014 17:26:50)
Офлайн
857
saw_toothВторая программа неправильно определяет путь для своих конфигов. Независимо от способа запуска она должна находить свои конфиги там, где они находятся.
Не исключено что она кривая, я в этом уверен, но суть в другом. Скрипт, когда запускает ЕХЕшник, говорит ему о его положении как я понял, и вот оно не совпадает с настоящим, поэтому ЕХЕ не видит свои файлы.
Офлайн
253
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)
Офлайн