Пытаюсь открыть прогу через Julias REPL. Я хотел бы, чтобы результат был таким, как если бы я дважды щелкнул файл .exe в проводнике.
Я пытался использовать run(`program.exe`)
, но не смог найти файл. Потом я понял, что мне нужна команда впереди, поэтому я попробовал run(`run program.exe`)
. Это, кажется, находит программу, но она сразу же падает.
Да, я пробовал это. Он выдал то же сообщение об ошибке, что и раньше ( IOError: не удалось создать xfoil.exe
: неизвестная ошибка (НЕИЗВЕСТНО) ), где xfoil.exe — это программа.
Ответ, данный hckr (с cmd /c
), будет моим вторым шагом. Это работает для вас (как я вижу, вы не приняли это)?
Извините, я ответил вам до того, как посмотрел ответ hckr, и с тех пор принял его. Были необычные обстоятельства, из-за которых ваш ответ дал ошибку, смысл которой был устранен.
Я предполагаю, что операционная система вашего компьютера - Windows.
Возможно, вам придется использовать полный путь к вашему исполняемому файлу, и хороший способ ввести путь при создании объекта команды с помощью ``
— создать строку и интерполировать ее. В противном случае могут возникнуть проблемы с пробелами и специальными символами. Вот пример,
path = "C:\\Program Files\\Mozilla Firefox\\firefox.exe"
run(`$path`)
Однако запуск таким образом не всегда похож на двойной щелчок по EXE-файлу. Запущенный исполняемый файл может быть все еще подключен к вашему терминалу, и вы не можете запускать новые команды в Julia REPL, пока созданный процесс не завершится. Например, попробуйте следующее и попробуйте ввести команду в Julia REPL, не закрывая окно:
run(`notepad`)
Если вы не хотите такого поведения, вы можете использовать run
с опцией ключевого слова wait=false
.
run(`$path`, wait=false)
Если ожидание равно false, процесс выполняется асинхронно, а потоки ввода-вывода процесса направляются на devnull
. На самом деле это не отсоединяется от процесса. Если вы убьете процесс julia
, процесс исполняемого файла также будет уничтожен.
Вместо этого вы можете использовать cmd /c start
, чтобы открыть исполняемый файл в другом cmd
окне. Процесс исполняемого файла должен быть отсоединен от Джулии.
run(`cmd /c start $path`)
Вы можете найти больше информации о запуске внешних программ в соответствующая запись руководства Julia.
Спасибо тебе за это. Теперь это работает. Оказывается, исполняемый файл каким-то образом был поврежден и возвращал Джулии неизвестную ошибку при попытке запуска. Команда запуска cmd поняла это и смогла выдать осмысленную ошибку. Теперь приложение открывается в желаемом REPL. Есть ли у вас какие-либо идеи о том, как перенести эту концепцию в область open(`program.exe`,"r+")
? Программа по-прежнему вылетает при запуске при таком запуске.
@hckr, вам не нужно использовать cmd /c start
- у команды запуска run
есть опция для этого - например. run(`notepad`, wait=false)
@Przemyslaw Szufel: иногда вам нужно cmd /c
, например. вы должны использовать его для запуска dir
под Windows.
комментарий был о cmd /c start
, а не cmd /c
о себе. start
отсоединяет процесс и вместо него можно использовать wait=false
.
@PrzemyslawSzufel Я добавил wait=false
к ответу, хотя wait=false
не отсоединяет процесс: если вы убиваете julia
процесс, исполняемый процесс также умирает.
@ user3013702 Я так не думаю. cmd /c start
создает независимый процесс, open
AFAIK нужен подпроцесс. Я не эксперт, но, возможно, перенаправление stderr
в файл или куда-то еще, чтобы увидеть ошибку, может помочь. Вы можете использовать pipeline
для перенаправления ввода/вывода. Кроме того, может ли быть так, что автор exe сделал так, что процесс не может работать как подпроцесс? Люди могут принять некоторые меры, чтобы попытаться предотвратить обратный инжиниринг, например...
Процесс может быть конвейерным. В настоящее время я делаю это на С++ с помощью popen(). Согласно моим исследованиям, open(`program.exe`,"r+")
должен обеспечивать взаимодействие с программой. Я изучу использование pipeline()
@hckr У меня все работает. Для чтения/записи в программу мне пришлось использовать: p = open(pipeline(`program.exe`),"r+")
и затем `write(p,"foo"). Спасибо за всю твою помощь!
Пробовали
run(full_path_to_the_executable/program.exe)
?