[python] externí program proměnné

Petr Přikryl prikryl na atlas.cz
Čtvrtek Listopad 21 16:17:28 CET 2013


Přímo z shelu (cmd) se o něčem takovém nedá rozumně
uvažovat. Musela by se nějak fikaně modifikovat datová oblast
rodičovského procesu, což žádný OS nevidí rád. 
Proměnné prostředí zde se vždycky kopírují do dětského procesu
a dělá se to v okamžiku vytváření nového procesu. Opačná cesta není.
 
Jenže Python se do té cesty umí vklínit jinak. Umí vytvořit nový
proces a předhodit mu místo kopie svůj vlastní prostor s proměnnými
prostředí. Ale ten je taky jen kopií z jeho otce. To znamená, že v Pythonovském
procesu sice zjistím, co udělal potomek, ale rodičovi už to ven neřeknu.
 
Dejme tomu, že mám dávku a.bat
==============================
@echo off
set moje=moje promenna prostredi
echo %0: %moje%
==============================
 
Pythonovský skript může vypadat takto (a.py)
==============================
#!python3

import os
import subprocess

p = subprocess.Popen('a.bat', env=os.environ)
retcode = p.wait()

v = os.environ['moje']

print('Python: retcode z davky je {}, vracena hodnota je {}'.format(retcode, repr(v)))
==============================
 
Vypíše to:
==============================
c:\__Python\geon>a.py
a.bat: moje promenna prostredi
Python: retcode z davky je 0, vracena hodnota je 'moje promenna prostredi'
==============================
 
Tady to není nic proti ničemu -- žádné znásilňování. Jen se prostě neudělá kopie
vlastního prostředí, ale předá se to stejné prostředí dětskému procesu.
 
 
> 2013/11/20 <geon na post.cz <mailto:geon na post.cz>>
>
>     Jak z Pythonu zavolat externí program (*.bat), aby po navrácení do
>     pyscriptu zůstaly zachovány systémové proměnné v něm nastavené?
>
>     wxp, w7, py3.2, py2.7


Další informace o konferenci Python