Wat is de beste manier om een ​​script uit een ander script te bellen?

Ik heb een script met de naam test1.pydie niet in een module is. Het heeft alleen code die moet worden uitgevoerd wanneer het script zelf wordt uitgevoerd. Er zijn geen functies, klassen, methoden, enz. Ik heb een ander script dat als een service draait. Ik wil test1.pyuit het script uitvoeren als een service.

Bijvoorbeeld:

Bestand test1.py:

print "I am a test"
print "see! I do nothing productive."

Bestand service.py:

# Lots of stuff here
test1.py # do whatever is in test1.py

Ik ben op de hoogte van de ene methode die het bestand opent, de inhoud leest en het in principe evalueert. Ik neem aan dat er een betere manier is om dit te doen. Of ik hoop het tenminste.


Antwoord 1, Autoriteit 100%

De gebruikelijke manier om dit te doen is iets als het volgende.

Test 1. Py

def some_func():
    print 'in test 1, unproductive'
if __name__ == '__main__':
    # test1.py executed as script
    # do something
    some_func()

service.py

import test1
def service_func():
    print 'service func'
if __name__ == '__main__':
    # service.py executed as script
    # do something
    service_func()
    test1.some_func()

Antwoord 2, Autoriteit 55%

Dit is mogelijk in Python 2 met

execfile("test2.py")

Zie de Documentatie voor de afhandeling van naamruimten, indien belangrijk in jouw zaak.

In Python 3 is dit mogelijk (dankzij @FantAstory)

exec(open("test2.py").read())

U moet echter overwegen om een ​​andere aanpak te gebruiken; Je idee (van wat ik kan zien) ziet er niet erg schoon uit.


Antwoord 3, Autoriteit 28%

Nog een manier:

Bestandstest 1. Py:

print "test1.py"

Bestandsservice.py:

import subprocess
subprocess.call("test1.py", shell=True)

Het voordeel van deze methode is dat u geen bestaand Python-script hoeft te bewerken om al zijn code in een subroutine te plaatsen.

Documentatie: python 2 , Python 3


Antwoord 4, Autoriteit 8%

Als u test1y wilt om uitvoerbaar bestand te blijven met dezelfde functionaliteit als wanneer het in de binnenkant wordt genoemd. Py, doe dan zoiets als:

Test 1. Py

def main():
    print "I am a test"
    print "see! I do nothing productive."
if __name__ == "__main__":
    main()

service.py

import test1
# lots of stuff here
test1.main() # do whatever is in test1.py

Antwoord 5, Autoriteit 7%

import os
os.system("python myOtherScript.py arg1 arg2 arg3")  

Met os kunt u rechtstreeks naar uw terminal bellen. Als u nog specifieker wilt zijn, kunt u uw invoerreeks samenvoegen met lokale variabelen, bijv.

command = 'python myOtherScript.py ' + sys.argv[1] + ' ' + sys.argv[2]
os.system(command)

Antwoord 6, autoriteit 4%

Je zou dit niet moeten doen. Doe in plaats daarvan:

test1.py:

def print_test():
      print "I am a test"
      print "see! I do nothing productive."

service.py

#near the top
from test1 import print_test
#lots of stuff here
print_test()

Antwoord 7, autoriteit 4%

Ik geef de voorkeur aan runpy:

#!/usr/bin/env python
# coding: utf-8
import runpy
runpy.run_path(path_name='script-01.py')
runpy.run_path(path_name='script-02.py')
runpy.run_path(path_name='script-03.py')

Antwoord 8, autoriteit 3%

Gebruik import test1voor het eerste gebruik – het zal het script uitvoeren. Voor latere aanroepen behandelt u het script als een geïmporteerde module en roept u de reload(test1)methode.

Als reload(module)wordt uitgevoerd:

  • De code van Python-modules wordt opnieuw gecompileerd en de code op moduleniveau wordt opnieuw uitgevoerd, waardoor een nieuwe set objecten wordt gedefinieerd die zijn gekoppeld aan namen in het woordenboek van de module. De init-functie van uitbreidingsmodules heet niet

Een eenvoudige controle van sys.moduleskan worden gebruikt om de juiste actie op te roepen. Om naar de scriptnaam te blijven verwijzen als een tekenreeks ('test1'), gebruikt u de import()’ingebouwd.

import sys
if sys.modules.has_key['test1']:
    reload(sys.modules['test1'])
else:
    __import__('test1')

Antwoord 9

Waarom niet gewoon test1 importeren? Elk python-script is een module. Een betere manier zou zijn om een functie te hebben, b.v. main/run in test1.py, importeer test1 en voer test1.main() uit. Of u kunt test1.py als een subproces uitvoeren.


Antwoord 10

Zoals reeds vermeld, is runpyeen leuke manier om andere scripts of modules uit het huidige script uit te voeren.

Trouwens, het is vrij gebruikelijk dat een tracer of debugger dit doet, en onder dergelijke omstandigheden werken methoden zoals het rechtstreeks importeren van het bestand of het uitvoeren van het bestand in een subproces meestal niet.

Het heeft ook aandacht nodig om execte gebruiken om de code uit te voeren. U moet de juiste run_globalsopgeven om importfouten of andere problemen te voorkomen. Raadpleeg runpy._run_codevoor details.


Antwoord 11

Dit proces is enigszins onorthodox, maar zou in alle Python-versies werken,

Stel dat u een script met de naam ‘recommend.py’ binnen een ‘if’-voorwaarde wilt uitvoeren, gebruik dan,

if condition:
       import recommend

De techniek is anders, maar werkt!


Antwoord 12

Dit is een voorbeeld met subprocessbibliotheek:

import subprocess
python_version = '3'
path_to_run = './'
py_name = '__main__.py'
# args = [f"python{python_version}", f"{path_to_run}{py_name}"]  # Avaible in python3
args = ["python{}".format(python_version), "{}{}".format(path_to_run, py_name)]
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()
if not error_:
    print(output)
else:
    print(error_)

Antwoord 13

Voeg dit toe aan je python-script.

import os
os.system("exec /path/to/another/script")

Dit voert dat commando uit alsof het in de shell is getypt.


Antwoord 14

Een voorbeeld om het te doen met behulp van subproces.

from subprocess import run

import sys

run([sys.executable, 'fullpathofyourfile.py'])

Other episodes