2014-01-12 56 views
3

除了使用诸如.txt/dummy文件之类的东西外,是否可以将值从一个程序传递到另一个程序?将值从一个Python程序传递到另一个程序

我有一个程序使用.txt文件将起始值传递给另一个程序。我每次运行程序时都会更新文件中的值(十次,基本上是同时)。这样做很好,但我希望在完成时将“孩子”计划报告给“母亲”计划,并且还要报告找到哪些文件可供下载。

是否有可能做到这一点,而不使用十一个文件来做到这一点(这是'孩子','母亲'报告的每个实例,以及'母亲'到'孩子'的一个文件)?我正在谈论完全独立的程序,而不是类或功能或类似的东西。我需要'孩子'程序运行十次,让事情更快完成。为了有效地运作,而不是等待几个小时完成所有事情,我需要'孩子'程序运行十次,让事情做得更快。因此,我运行孩子程序十次,并给每个程序一个单独的范围来检查。

这两个程序都运行正常,但我想让它们彼此之间来回运行/报告,并希望不会使用文件“传输”来完成任务,特别是在传输的子母方面数据的。

“母亲”计划......目前

import os 
import sys 
import subprocess 
import time 

os.chdir ('/media/') 

#find highest download video 
Hival = open("Highest.txt", "r") 
Histr = Hival.read() 
Hival.close() 
HiNext = str(int(Histr)+1) 

#setup download #1 
NextVal = open("NextVal.txt","w") 
NextVal.write(HiNext) 
NextVal.close() 

#call download #1 
procs=[] 
proc=subprocess.Popen(['python','test.py']) 
procs.append(proc) 
time.sleep(2) 

#setup download #2-11 
Histr2 = int(Histr)/10000 
Histr2 = Histr2 + 1 

for i in range(10): 
    Hiint = str(Histr2)+"0000" 
    NextVal = open("NextVal.txt","w") 
    NextVal.write(Hiint) 
    NextVal.close() 

    proc=subprocess.Popen(['python','test.py']) 
    procs.append(proc) 
    time.sleep(2) 
    Histr2 = Histr2 + 1 

for proc in procs: 
    proc.wait() 

“儿童”程序

import urllib 
import os 
from Tkinter import * 
import time 

root = Tk() 
root.title("Audiodownloader") 
root.geometry("200x200") 

app = Frame(root) 
app.grid() 

os.chdir('/media/') 
Fileval = open('NextVal.txt','r') 
Fileupdate = Fileval.read() 
Fileval.close() 
Fileupdate = int(Fileupdate) 
Filect = Fileupdate/10000 
Filect2 = str(Filect)+"0009" 
Filecount = int(Filect2) 
while Fileupdate <= Filecount: 
    root.title(Fileupdate) 
    url = 'http://www.yourfavoritewebsite.com/audio/encoded/'+str(Fileupdate)+'.mp3' 
    urllib.urlretrieve(url,str(Fileupdate)+'.mp3') 
    statinfo = os.stat(str(Fileupdate)+'.mp3') 
    if statinfo.st_size<10000L: 
     os.remove(str(Fileupdate)+'.mp3') 

    time.sleep(.01) 
    Fileupdate = Fileupdate+1 
    root.update_idletasks() 

我想原来的VB6程序在转换到Linux,使之更容易使用与此同时。因此缺少.mainloop。这是我第一次真正尝试Python中的任何东西,因此缺少def或类。我试图在1.5个月内不做任何事情之后回来完成这个任务,主要是因为不知道该怎么做。在不久前的研究中,我发现这是我的头脑。我从来没有做过任何与线程/套接字/客户端/服务器交互的任何事情,所以在这种情况下我完全是一个白痴。谷歌的任何东西,我只是被带回到这里来stackoverflow。

是的,我想同时运行10个程序副本,以节省时间。如果程序有可能向母亲报告,那么母亲可以在屏幕上打印正在搜索的当前值,我可以不使用GUI接口。以及孩子是否可以在完成时报告,以及是否有任何文件下载成功(相对于下载,然后由于变小而被删除)。我会使用成功的下载信息在程序下次运行时更新Highest.txt。

我认为这可能会澄清更好的事情......或者我不明白使用服务器/客户端交互的本质:)只有原因time.sleep是在程序中,是由于试图确保文件可以在孩子程序的下一个实例运行之前写入。我不确定我会遇到什么样的时间问题,所以我将这些线路包括在内以确保安全。

+2

多德。添加一些换行符。这是很痛苦的阅读。 – Blorgbeard

回答

1

当您谈论使用txt在程序之间传递信息时,我们首先需要知道您使用的是哪种语言。 在我对Java和Python achi的知识中,尽管需要依赖工作量的信息量,但仍然可行。

在python中,您可以使用它随附的库来读写txt和计划执行,您可以使用apscheduler。

+3

问题标题是“Python”。 –

+1

另一种语言,所以人们可以为您提供更具体的答案,并使用您的知识来提高答案。 –

5

这可以使用多处理库使用简单的客户端/服务器拓扑来实现。使用你的母亲/孩子术语:

server.py

from multiprocessing.connection import Listener 

# client 
def child(conn): 
    while True: 
     msg = conn.recv() 
     # this just echos the value back, replace with your custom logic 
     conn.send(msg) 

# server 
def mother(address): 
    serv = Listener(address) 
    while True: 
     client = serv.accept() 
     child(client) 

mother(('', 5000)) 

client.py

from multiprocessing.connection import Client 

c = Client(('localhost', 5000)) 

c.send('hello') 
print('Got:', c.recv()) 

c.send({'a': 123}) 
print('Got:', c.recv()) 

运行与

$ python server.py 
$ python client.py 
+0

因此,假设语言不同,一个人可以在除了本地tcp端口之外的独立任务之间使用“如此命名的多处理”互通行为吗?因为这就是我一直使用的(对于非tcp连接),在这种情况下,后面提到的protocole的技术名称是什么? – Abra001

相关问题