'Calling a python script within another python script with args

Current Implementation which needs optimization

import subprocess
childprocess = subprocess.Popen(
['python',
'/full_path_to_directory/called_script.py',
'arg1',
'arg2'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
returnVal = childprocess.communicate()[0]
print(retVal)

Is this a correct way to call another script(called_script.py) within the current working directory? Is there a better way to call the other script? I used import script but it gives me below error

called_script.py

def func(arg1, arg2, arg3):
 #doSomething
 #sys.out.write(returnVal)

if __name__ == "__main__": 
  func(arg1, arg2, arg3)

Implementation 2 (throws exception and errored out) caller_script.py Both of them are under the same path (i.e. /home/bin)

import called_script
returnVal = called_script.func(arg1,arg2,arg3)
print(returnVal)

Output:

nullNone
Traceback (most recent call last):
  File "/path_to_caller/caller_script.py", line 89, in <module>
    l.simple_bind_s(binddn, pw)
  File "/usr/lib64/python2.6/site-packages/ldap/ldapobject.py", line 206, in simple_bind_s
    msgid = self.simple_bind(who,cred,serverctrls,clientctrls)
  File "/usr/lib64/python2.6/site-packages/ldap/ldapobject.py", line 200, in simple_bind
    return self._ldap_call(self._l.simple_bind,who,cred,EncodeControlTuples(serverctrls),EncodeControlTuples(clientctrls))
  File "/usr/lib64/python2.6/site-packages/ldap/ldapobject.py", line 96, in _ldap_call
    result = func(*args,**kwargs)
TypeError: argument 2 must be string or read-only buffer, not None

Another alternative I used and gave me an error is Implementation 3(throws exception and errors out) caller_script.py

import ldap
returnVal = subprocess.call(['python','called_script.py','arg1','arg2'])
print(returnVal)
l = ldap.initialize(cp.get('some_config_ref','some_url'))
try:
    l.protocol_version = ldap.VERSION3
    l.simple_bind_s(binddn, returnVal)
except ldap.INVALID_CREDENTIALS:
  sys.stderr.write("Your username or password is incorrect.")
  sys.exit(1)
except ldap.LDAPError, e:
  if type(e.message) == dict and e.message.has_key('xyz'):
      sys.stderr.write(e.message['xyz'])
  else:
      sys.stderr.write(e)
  sys.exit(1)

Output:

returnVal0Traceback (most recent call last):
  File "./path_to_script/caller_script.py", line 88, in <module>
    l.simple_bind_s(binddn, pw)
  File "/usr/lib64/python2.6/site-packages/ldap/ldapobject.py", line 206, in simple_bind_s
    msgid = self.simple_bind(who,cred,serverctrls,clientctrls)
  File "/usr/lib64/python2.6/site-packages/ldap/ldapobject.py", line 200, in simple_bind
    return self._ldap_call(self._l.simple_bind,who,cred,EncodeControlTuples(serverctrls),EncodeControlTuples(clientctrls))
  File "/usr/lib64/python2.6/site-packages/ldap/ldapobject.py", line 96, in _ldap_call
    result = func(*args,**kwargs)
TypeError: argument 2 must be string or read-only buffer, not int


Solution 1:[1]

Here is an example where you are calling a function from another file, you pass one value, a list, which can have an arbitrary amount of numbers, and you get the sum. Make sure they are in the same directory or you will need the path. The function in your example "script.py" does not allow you to pass a value.

called_script.py

def add_many(list_add):
    the_sum = sum(list_add)
    return the_sum

caller_script.py

import called_script

a_list = [1, 2, 3, 4]
the_sum = called_script.add_many(a_list)
print(the_sum)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 big_daddy