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()