Thanks for everyone who replied so far, it is appreciated.  (I don't particularly like asking for help and taking up other peoples' time, but I really ran out of ideas.)

Chris, thanks for your explanation:

        With exec, the intention is to*replace*  the current program, not to
        invoke it and wait till it's done. The current program will not
        continue after a successful exec.

That describes exactly what I want to do, but haven't succeeded in doing so far.  It's a bit frustrating that I can't do what I have been doing routinely for decades in another language.

dn asked

    What is the definition of "finish" in the first program?
    Not sure if have understood <<<(*not* waiting for the second to finish, as with e.g. os.system)>>>.

My definition of "finish" is that the program exits (sys.exit()  and friends), without waiting for the second program to finish. So if I were "chaining" say to a .exe file, the Python interpreter would shut down immediately.
In Chris' words, I want the second program to *replace* the first one.

Barry, thanks for your suggestion:

        os.execl('C:\\Python38\\python.exe', 'C:\\Python38\\python.exe', 
'X2.py')

but I'm afraid it didn't help.  I tried it and got the same behaviour (Python and Windows alternately grabbing console input lines) as my "ATTEMPT #8" which used

    subprocess.Popen('-c X2.py', executable=sys.executable)

Anything dubious about exec (or whatever) doesn't worry me as this is development, not live installation.

Let me describe my actual use case.  I am developing a large Python program (in Windows, working in DOS boxes) and I constantly want to modify it and re-run it.  What I have been doing is to make it respond to a hotkey by calling itself via os.system.  The problem is that if I do this 50 times I am left with 51 instances still running, each one waiting for the next to finish.  That's actually OK, except that when I finally shut it down, it takes a long time (about 2.5 sec per instance).

I have found a workaround: a small shell program which calls the main program (wth os.system), then when the latter exits, calls it again (if required).  Starting the main program is slightly slower, but acceptably so; shutting it down becomes constant time.

But I would still like to be able to do it as I originally planned, if possible.  Not least because I may have other uses for program "chaining" in future.

Best wishes
Rob Cliffe

On 23/08/2020 21:37, dn via Python-list wrote:
On 23/08/2020 19:31, Rob Cliffe via Python-list wrote:
On WIndows 10, running Python programs in a DOS box, I would like one Python program to chain to another. I.e. the first program to be replaced by the second (*not* waiting for the second to finish, as with e.g. os.system).  This doesn't seem a lot to ask, but so far I have been unable to so this.  I am using Python 3.8.3.  Some attempts so far (may be nonsensical):

What is the definition of "finish" in the first program?
Not sure if have understood <<<(*not* waiting for the second to finish, as with e.g. os.system)>>>. In Python, the easiest way to chain two "modules" is to use import. This gives full control to the 'import-er'.


ATTEMPT #1
----------------
# File X1.py
import os
print("This is X1")
os.execl('C:\\Python38\\python.exe', 'X2.py')

# File X2.py
print("This is X2")


# File X1.py
import os
def fn():
    print("This is X1")
    os.execl('C:\\Python38\\python.exe', 'X2.py')
    #  !!!!!

# File X2.py
def fn():
    print("This is X2")

# File x3.py
import x1
import x2
x1.fn()
x2.fn()
print( "x3 terminating" )



--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to