Python Forum

Full Version: call a variable from one function to another ...
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
hello all ...
i need to call this variable ( filename )from function qassam() inside another fileex() ..
this is my code :

import os 
def qassam():
        filename = "/root/Downloads/scapy.txt"
        #return filename


def fileex():
    filename = qassam
    if os.path.isfile(filename):
        print("is there")
    else:
        print("else ... ")
        
fileex()
error :
Error:
Traceback (most recent call last): File "/tmp/ArpScanner/arp.py", line 15, in <module> fileex() File "/tmp/ArpScanner/arp.py", line 10, in fileex if os.path.isfile(filename): File "/usr/lib/python2.7/genericpath.py", line 37, in isfile st = os.stat(path) TypeError: coercing to Unicode: need string or buffer, function found
Function variables are local to function. They cannot be shared.

options.
maybe have function return variable.
import os 
def qassam():
    filename = "/root/Downloads/scapy.txt"
    return filename
 
 
def fileex():
    filename = qassam()
    if os.path.isfile(filename):
        print("is there")
    else:
        print("else ... ")
         
fileex()
Make shared variables
import os 

class ShareVariables:
    filename = ""

def qassam():
    ShareVariables.filename = "/root/Downloads/scapy.txt"
 
 
def fileex():
    if os.path.isfile(ShareVariables.filename):
        print("is there")
    else:
        print("else ... ")

qassum()         
fileex()
My least favorite. Have global variable
import os 
filename = ""

def qassam():
    global filename
    filename = "/root/Downloads/scapy.txt"
 
 
def fileex():
    if os.path.isfile(filename):
        print("is there")
    else:
        print("else ... ")

qassum()         
fileex()
but how its work while its not global ??? i try to use return and its working :
import os

def qassam():
        filename = "/root/Downloads/scapy.txt"
        return filename


def fileex():
    filename = qassam()
    #x = filename
    print(filename)
    if os.path.isfile(str(filename)):
        print("is there")
    else:
        print("else ... ")
        
fileex()
Roughly. Low level stuff.
Anytime a function return a variable.
It is put on the stack.
Function closes.
Then stack item is assign to variable.

python bytecode.
import os
import dis

def qassam():
    filename = "/root/Downloads/scapy.txt"
    return filename


def fileex():
    filename = qassam()
    if os.path.isfile(filename):
        print("is there")
    else:
        print("else ... ")

dis.dis(fileex)
Output:
10 0 LOAD_GLOBAL 0 (qassam) 2 CALL_FUNCTION 0 4 STORE_FAST 0 (filename) 11 6 LOAD_GLOBAL 1 (os) 8 LOAD_ATTR 2 (path) 10 LOAD_METHOD 3 (isfile) 12 LOAD_FAST 0 (filename) 14 CALL_METHOD 1 16 POP_JUMP_IF_FALSE 28 12 18 LOAD_GLOBAL 4 (print) 20 LOAD_CONST 1 ('is there') 22 CALL_FUNCTION 1 24 POP_TOP 26 JUMP_FORWARD 8 (to 36) 14 >> 28 LOAD_GLOBAL 4 (print) 30 LOAD_CONST 2 ('else ... ') 32 CALL_FUNCTION 1 34 POP_TOP >> 36 LOAD_CONST 0 (None) 38 RETURN_VALUE
You do need to call the first function at some point if you want to exploit it later.

One approach, rather than returning a value or using globals is to set an attribute:

import os 
def qassam():
        qassam.filename = "words.csv"
 
def fileex():
    filename = qassam.filename
    if os.path.isfile(filename):
        print("is there")
    else:
        print("else ... ")

qassam()         
fileex()