pythonlearner9001
pythonlearner9001

Reputation: 348

Getting Environment Variables Of An User By Using Python

I have defined an environment variable by adding export TEST1=VAL1 line into /home/username/.bashrc file.

This variable is listed when printenv command is used on terminal on my user account. But it is not listed when the following python code is used:

variables = subprocess.check_output("printenv", shell=True, executable='/bin/bash').decode()

What is the solution for listing this variable by using Python.

OS: Debian-like Linux, Python: 3.9

Example code for running terminal commands in python:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

builder = Gtk.Builder()
builder.add_from_file('test.ui')
window1 = builder.get_object('window1')

class Signals:
    def on_window1_destroy(self, widget):
        Gtk.main_quit()

builder.connect_signals(Signals())

import subprocess
variables = subprocess.check_output("/bin/bash -l -c printenv", shell=True).decode()
f = open("/tmp/env.txt","w")
f.write("%s" % (variables))
f.close()

window1.show_all()
Gtk.main()

GUI file:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <property name="default_width">300</property>
    <property name="default_height">300</property>
    <child>
      <placeholder/>
    </child>
    <child>
      <object class="GtkTreeView" id="treeview1">
        <property name="visible">True</property>
        <property name="can_focus">True</property>
        <child internal-child="selection">
          <object class="GtkTreeSelection"/>
        </child>
      </object>
    </child>
  </object>
</interface>

Upvotes: 0

Views: 177

Answers (1)

Arnaud Valmary
Arnaud Valmary

Reputation: 2327

With shells, there is a difference between login and non login execution (see man bash).

executable attribute does not accept parameters, just an executable.

So try:

#! /usr/bin/python
import subprocess
variables = subprocess.check_output("/bin/bash -c printenv", shell=True).decode()
f = open("/tmp/env.txt","w")
f.write("%s" % (variables))
f.close()

Output do not contains TEST1 variable.

With bash -l option:

#! /usr/bin/python
import subprocess
variables = subprocess.check_output("/bin/bash -l -c printenv", shell=True).decode()
f = open("/tmp/env.txt","w")
f.write("%s" % (variables))
f.close()

Output contains TEST1 variable.

Upvotes: 1

Related Questions