python subprocess

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Oltronix
Inlägg: 513
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

python subprocess

Inlägg av Oltronix »

Hur får man fram shell-enviroment-variabler-data i python? På något likande sätt

Kod: Markera allt

import subprocess
var="USER"
result = subprocess.run(['echo', var], capture_output=True, text=True)
print(result.stdout)
På motsvarande sätt i shell:

Kod: Markera allt

echo $USER
Användarvisningsbild
Icecap
Inlägg: 26814
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: python subprocess

Inlägg av Icecap »

När jag programmerar via en ST-LINK, skriver jag:
callstring = <en massa med stm32_programmer_cli.exe o parameter o skit>
result = subprocess.run(callstring, capture_output=True)
code = result.returncode # I detta fall är 0=inget fel, allt OK

Ska du jobba vidare i Python med result-texten:
pythontext = result.stdout.decode('utf-8')
Senast redigerad av Icecap 24 januari 2026, 17:25:38, redigerad totalt 1 gång.
guckrum
Inlägg: 1993
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: python subprocess

Inlägg av guckrum »

os.environ
Användarvisningsbild
Oltronix
Inlägg: 513
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: python subprocess

Inlägg av Oltronix »

Jag har en fil med data som jag vill läsa var den ligger till ett python-program. text /home/erik/Album1/Rubrik Den kan ligga på olika ställen beroende på olika album tex /home/erik/Album3/Rubrik.

Adressen till den aktuella filen kan ligga i en fil eller en shell-variabel. Har inte besämt mig hur ännu
Användarvisningsbild
Oltronix
Inlägg: 513
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: python subprocess

Inlägg av Oltronix »

Jag har ett pythonprogram som skapar olika fotoalbum. Jag vill inte ha "samma" pythonprogrammet på olika mappar där fotona finns. Då är det är svårt att hålla reda på versioner då jag ändrar programmet ofta emellanåt. Dock är det vissa data som är specifika för varje album som jag läser in i programmet. Tex albumets namn, vilka är människorna på bilderna, mm (jag har caption på varje bild men vill ha mera data i separat fil). Den albumspecifika datan finns där bilderna ligger.

Jag har ett lokalt shell-script för varje album som sparkar igång den genensamma pythonprogrammet men jag måste även överföra den lokala informationen till pythonprogrammet. Jag kan ha all data i shell-scriptet. Det har jag fått fungera med subprocess men är även nyfiken att veta hur man läser shell-varibler.
Användarvisningsbild
Oltronix
Inlägg: 513
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: python subprocess

Inlägg av Oltronix »

guckrum skrev: 24 januari 2026, 17:24:08os.environ
Jag får testa detta..
edit1:
Fungerar!

edit2:
Testade först detta:
https://unix.stackexchange.com/question ... hon-script

Kod: Markera allt

import subprocess
var = 'foobar'

first = subprocess.Popen(['/bin/echo', var], stdout=subprocess.PIPE)
second = subprocess.Popen(['bash', '/path/to/script', '--args'], stdin=first.stdou

second2= subprocess.check_output(['bash', '/path/to/script', '--args'], stdin=first.stdo
Men fattade inte hur variablen "var" fungerar här. "var" verkar vara menglös här.
Användarvisningsbild
Icecap
Inlägg: 26814
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: python subprocess

Inlägg av Icecap »

Min tanke är att 'var' är som en parameter till programmet som kallas.
Typ: <program som kallas> <'var'> <...fler parameter...>
guckrum
Inlägg: 1993
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: python subprocess

Inlägg av guckrum »

Jag var kanske lite kortfattad tidigare. Minimalt pythonprogram

Kod: Markera allt

import os
print(os.environ['minvariabel'])
och kör det såhär tex

Kod: Markera allt

minvariabel=elefant python programmet.py
kommer den att skriva ut "elefant". Så då har du skickat en shell-variabel in i Pythonprogrammet, och det var så jag uppfattade frågeställningen.


Det känns som att du skall ha ett enda pythonprogram som löser ditt problem utan att blanda in några shellscript etc.

Antingen skapar du en fil som innehåller en katalog per rad som programmet skall titta i, eller så använder du
tex glob.glob() för att låta programmet hitta alla dina datafiler automatiskt och därefter loopa över dem. Hmm?
Användarvisningsbild
Oltronix
Inlägg: 513
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: python subprocess

Inlägg av Oltronix »

Så här ser koden ut:

Kod: Markera allt

ver=["2026-01-24", "2026-01-23", "2026-01-17", "2026-01-16", "2026-01-04", "12-18", "07-20", "2025-06-12"]

import datetime

with open("pre1.html") as f1:	#read first part of html file
   print(f1.read())
html0="""<div class="container">
  Created {datum}<br>init.py ver {vers}<h2 style="text-align: center;   margin-left: 400px; margin-right: 400px" > {rubrik}</h2>
  <div class="row">
  
      <div class="col-sm-8 col-md-2">
       <div class="box">
        <a href="./help.html">
          <img src="./help.html" alt="Hjälp" style="width:100%">
        </a>
      </div>
    </div>
  
      <div class="col-sm-8 col-md-2">
       <div class="box">
        <a href="./person.html">
          <img src="./person.html" alt="Personer" style="width:100%">
        </a>
      </div>
    </div>"""
    
html ="""    <div class="col-sm-8 col-md-2">
      <div class="box">
      <figure class="album-photoxxx">
        <a href="./bilder/{Pic}>
        
          <img src="./bilder/{Pic} alt="Lights" style="width:100%">
          <figcaption>{cap}</figcaption>			
        </figure>
        </a>
      </div>
    </div>"""
dat=datetime.datetime.now() 
dat=dat.strftime("%Y-%m-%d %H:%M")
Rubrik="Rubrik-x"
with open(Rubrik) as f1:
  rubrik1=f1.readline()
  r2=f1.readline()
  r3=f1.readline()
  r4=f1.readline()
  
print(html0.format(datum = dat, vers=ver[0], rubrik=rubrik1+r2+r3+r4))
#print(html0.format(version = ver))
pic_lista="list"
with open(pic_lista) as f:
  for line in f:
    line=line.split()
    if not line:	#check  if line empty
       break		#If yes exit loop
    name=line[0]
    try:
       #caption=line[1]	#check if second argument exists
       str1=line[1:len(line)]
       caption = " ".join(map(str, str1)) #list to string
    except:
       caption="nil cap" #no
       

    name=name.rstrip()+'\"'
    print(html.format(Pic = name, cap=caption.rstrip()))

with open("post.html") as f2:	#read closing part of html file
   print(f2.read())
Det är bla variablerna "pic_lista" och "Rubrik" som skall sättas till olika värden.
Jag kan använda:

Kod: Markera allt

minvariabel=elefant python programmet.py
med olika värden på "minvariabel" för att avgöra vilka data jag skall läsa in.

Tack! Jag gjorde problemet mer komplicerat än nödvändigt när jag använde pythons subprocess, men nu har gjort det och kanske lärt mig nått.
Användarvisningsbild
Oltronix
Inlägg: 513
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: python subprocess

Inlägg av Oltronix »

Jag vet inte om jag skall skämmas, gråta eller skratta. Dock skrattade jag när jag upptäckte mitt tankefel.
Jag har lade till

Kod: Markera allt

minvariabel=elefant python programmet.py
i min kod och använde sedan python match/case. Då upptäckte jag att jag inte behövde detta. Det räckte med att lägga till

Kod: Markera allt

link="/home/erik/Bilder/Bootstrap/bin/"
pre=link+"pre1.html"
post=link+"post.html"
Rubrik="Rubrik"
pic_lista="list"
Dock har har jag lärt något nytt som kan använda vid annat tillälle.
Skriv svar