#python #c #bash
#python #c #баш #c #bash
Вопрос:
Я пытаюсь написать код, который автоматизирует некоторые программы Heasoft от Nasa — это не имеет значения -,
heainit определяется в bashrc как:
export HEADAS=~/heasoft-6.27.2/x86_64-pc-linux-gnu-libc2.31
alias heainit='. $HEADAS/headas-init.sh
поэтому всякий раз, когда я пишу heainit на терминале, он работает довольно хорошо. Однако всякий раз, когда я пытался передать «heainit» терминалу через c или Python, сам код работает, но он не запускает программу!
Я думаю, что alise не создает там фактического пути, но я перепробовал все возможности, о которых я говорил.
в c я пытался:
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <cstdlib>
#include <string>
#include <sstream>
using namespace std;
int main(int argc, char** argv){ string ind, outd;
const char* heainit = "/home/karim/heasoft-6.27.2/x86_64-pc-linux-gnu-libc2.31/headas-init.sh" ;
system(heainit);
return 0;
}
и
int main(string, char*){
string ind, outd;
std::string HEADAS = "/home/karim/heasoft-6.27.2/x86_64-pc-linux-gnu-libc2.31";
std::string str = std::string(". //") HEADAS std::string("/headas-init.sh");
const char *c = str.c_str(". /home/karim/heasoft-6.27.2/x86_64-pc-linux-gnu-libc2.31/heafas-init.sh");
system(const char* c);
return 0;
}
в python я пытался:
import os
import subprocess
os.system("heainit")
subprocess.run("heainit",capture_output=True)
и
HEADAS=~/heasoft-6.27.2/x86_64-pc-linux-gnu-libc2.31
heainit="." "t" HEADAS "/headas-init.sh"
subprocess.run(heainit, shell=True)
Моей последней попыткой было написать сценарий bash:
#!/bin/bash
export HEADAS=~/heasoft-6.27.2/x86_64-pc-linux-gnu-libc2.31
export HEADAS
alias heainit='. $HEADAS/headas-init.sh'
heainit
и в приглашении отображается следующее: ./hea.sh: line 6: heainit: command not found
всякий раз, когда я выполняю любой из вышеупомянутых кодов с помощью любой другой команды, например, например, «ls -l», он работает отлично: «)) Я еще не знаю, как мне передать этот аргумент (за ним должны следовать другие при запуске программы) терминалу, и я не знаю, что я долженне хватает идти. Возможно, проблема тривиальна, но я застрял там надолго.
Комментарии:
1. Вы понимаете, что
.
делает в оболочке? Какой смысл получать скрипт изsystem()
вызова? Зачем вам это делать? В любом случае это никак не влияет на текущий процесс.2. Каково содержимое файла? Это только установка переменных среды или фактическое создание каких-либо побочных эффектов?
3. Насколько я понимаю. запустите или откройте файл через оболочку.
4. запуск файла инициирует программу, которая выполняет временной анализ данных, собранных заранее, но это требует времени или аргументов вручную, и это отнимает много времени для почти 113 000 временных событий. Таким образом, я хочу автоматизировать этот процесс с помощью python или c , но для этого все равно требуется сначала запустить программу.
Ответ №1:
всякий раз, когда я пытался передать «heainit» терминалу через c или Python, сам код работает, но он не запускает программу!
heainit
является alias
. Итак, во-первых: system
вызов запускает оболочку в неинтерактивном режиме, в котором alias
игнорируется, и, во-вторых: скорее всего, у вас есть if [[ $- ~= *i* ]]
поверх вашего bashrc для возврата, когда оболочка не является интерактивной. Короче говоря: an alias
не является командой и предназначена для запуска только в интерактивной оболочке. псевдонимы оболочки bash вручную
Если вы хотите работать heainit
с терминала, вы можете создать исполняемый PATH
файл. Или вы могли бы создать функцию и добавить ее /etc/bash.bashrc
перед интерактивной проверкой или как /etc/profile.d/*
.
Тем не менее, это, скорее всего, ничего не решит, поскольку файл является исходным кодом. system()
вызов и subprocess()
запуск подпроцесса, среда подпроцесса не влияет на родительскую среду. Итак, если эта оценка верна, поиск файла фактически ничего не делает, поскольку он отправляет его в подпроцесс, который не влияет на текущую среду. Решением было бы написать анализатор файла (либо полноценный анализатор и интерпретатор оболочки, либо что-то более простое, в зависимости от содержимого файла) и проанализировать текст из файла внутри текущего процесса.