Julia - Как запустить исполняемый файл из REPL

Пытаюсь открыть прогу через Julias REPL. Я хотел бы, чтобы результат был таким, как если бы я дважды щелкнул файл .exe в проводнике.

Я пытался использовать run(`program.exe`), но не смог найти файл. Потом я понял, что мне нужна команда впереди, поэтому я попробовал run(`run program.exe`). Это, кажется, находит программу, но она сразу же падает.

Пробовали run(full_path_to_the_executable/program.exe)?

Bogumił Kamiński 06.04.2019 23:37

Да, я пробовал это. Он выдал то же сообщение об ошибке, что и раньше ( IOError: не удалось создать xfoil.exe: неизвестная ошибка (НЕИЗВЕСТНО) ), где xfoil.exe — это программа.

VileProtagonist 07.04.2019 00:42

Ответ, данный hckr (с cmd /c), будет моим вторым шагом. Это работает для вас (как я вижу, вы не приняли это)?

Bogumił Kamiński 07.04.2019 01:10

Извините, я ответил вам до того, как посмотрел ответ hckr, и с тех пор принял его. Были необычные обстоятельства, из-за которых ваш ответ дал ошибку, смысл которой был устранен.

VileProtagonist 07.04.2019 01:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
797
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что операционная система вашего компьютера - 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+")? Программа по-прежнему вылетает при запуске при таком запуске.

VileProtagonist 07.04.2019 01:12

@hckr, вам не нужно использовать cmd /c start - у команды запуска run есть опция для этого - например. run(`notepad`, wait=false)

Przemyslaw Szufel 07.04.2019 01:14

@Przemyslaw Szufel: иногда вам нужно cmd /c, например. вы должны использовать его для запуска dir под Windows.

Bogumił Kamiński 07.04.2019 01:23

комментарий был о cmd /c start, а не cmd /c о себе. start отсоединяет процесс и вместо него можно использовать wait=false.

Przemyslaw Szufel 07.04.2019 01:26

@PrzemyslawSzufel Я добавил wait=false к ответу, хотя wait=false не отсоединяет процесс: если вы убиваете julia процесс, исполняемый процесс также умирает.

hckr 07.04.2019 10:45

@ user3013702 Я так не думаю. cmd /c start создает независимый процесс, open AFAIK нужен подпроцесс. Я не эксперт, но, возможно, перенаправление stderr в файл или куда-то еще, чтобы увидеть ошибку, может помочь. Вы можете использовать pipeline для перенаправления ввода/вывода. Кроме того, может ли быть так, что автор exe сделал так, что процесс не может работать как подпроцесс? Люди могут принять некоторые меры, чтобы попытаться предотвратить обратный инжиниринг, например...

hckr 07.04.2019 11:12

Процесс может быть конвейерным. В настоящее время я делаю это на С++ с помощью popen(). Согласно моим исследованиям, open(`program.exe`,"r+") должен обеспечивать взаимодействие с программой. Я изучу использование pipeline()

VileProtagonist 07.04.2019 20:13

@hckr У меня все работает. Для чтения/записи в программу мне пришлось использовать: p = open(pipeline(`program.exe`),"r+") и затем `write(p,"foo"). Спасибо за всю твою помощь!

VileProtagonist 07.04.2019 20:31

Другие вопросы по теме