1

I'm working on a project where I would like to run a same script but with two different softwares api.

What I have : -One module for each software where I have the same classes and methods names. -One construction script where I need to call these classes and method.

I would like to not duplicate the construction code, but rather run the same bit of code just by changing the imported module.

Exemple :

first_software_module.py
import first_software_api
class Box(x,y,z):
 init():
 first_software_api.makeBox()
second_software_module.py
import second_software_api
class Box(x,y,z):
 init():
 second_software_api.makeBox()
construction.py
first_box = Box(1,2,3)

And I would like to run construction.py with the first module, then with the second module. I tryed with imports, execfile, but none of these solutions seems to work.

What i would like to do :

import first_software_module
run construction.py
import second_software_module
run construction.py
asked May 19, 2021 at 13:32
2
  • Why not pass the module name to construction & let it import it & run it? Commented May 19, 2021 at 13:36
  • Is it possible to do that inside an other python script ? Because I have to run the construction script inside a larger script Commented May 19, 2021 at 13:40

2 Answers 2

2

You could try by passing a command line argument to construction.py.

construction.py

import sys
if len(sys.argv) != 2:
 sys.stderr.write('Usage: python3 construction.py <module>')
 exit(1)
if sys.argv[1] == 'first_software_module':
 import first_software_module
elif sys.argv[1] == 'second_software_module':
 import second_software_module
box = Box(1, 2, 3)

You could then call construction.py with each import type from a shell script, say main.sh.

main.sh

#! /bin/bash
python3 construction.py first_software_module
python3 construction.py second_software_module

Make the shell script executable using chmod +x main.sh. Run it as ./main.sh.

Alternatively, if you do not want to use a shell script, and want to do it in pure Python, you could do the following:

main.py

import subprocess
subprocess.run(['python3', 'construction.py', 'first_software_module'])
subprocess.run(['python3', 'construction.py', 'second_software_module'])

and run main.py as you normally would using python3 main.py.

answered May 19, 2021 at 13:55
3
  • Actually I need to run it from inside an other python script, handling path to the software, file saves, etc... Is it possible with that solution ? Commented May 19, 2021 at 13:58
  • I've added how you can do it in Python. Does the modification work for you? Commented May 19, 2021 at 13:59
  • I'll give it a try Commented May 19, 2021 at 14:01
1

You can pass a command-line argument that will tell your script which module to import. There are many ways to do this, but I'm going to demonstrate with the argparse module

import argparse
parser = argparse.ArgumentParser(description='Run the construction')
parser.add_argument('--module', nargs=1, type=str, required=True, help='The module to use for the construction', choices=['module1', 'module2'])
args = parser.parse_args()

Now, args.module will contain the contents of the argument you passed. Using this string and an if-elif ladder (or the match-case syntax in 3.10+) to import the correct module, and alias it as (let's say) driver.

if args.module[0] == "module1":
 import first_software_api as driver
 print("Using first_software_api")
elif args.module[0] == "module2":
 import second_software_api as driver
 print("Using second_software_api")

Then, use driver in your Box class:

class Box(x,y,z):
 def __init__(self):
 driver.makeBox()

Say we had this in a file called construct.py. Running python3 construct.py --help gives:

usage: construct.py [-h] --module {module1,module2}
Run the construction
optional arguments:
 -h, --help show this help message and exit
 --module {module1,module2}
 The module to use for the construction

Running python3 construct.py --module module1 gives:

Using first_software_api
answered May 19, 2021 at 14:00

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.