将值从一个Python程序传递到另一个程序

5
除了使用类似于.txt /虚拟文件之类的东西,是否有可能从一个程序传递值到另一个程序?
我有一个程序,它使用.txt文件将起始值传递给另一个程序。每次运行它时(基本上同时运行十次),我在启动程序之间更新文件中的值。这样做很好,但我希望在“子”程序完成时,“子”程序向“母”程序报告,并报告它发现要下载的文件。是否可以这样做,而不使用11个文件来实现(这是每个“子”到“母”报告的一个文件,以及一份“母”到“子”的文件)? 我所说的是完全独立的程序,不是类或函数之类的东西。
为了高效运行,不必等待数小时才能完成所有操作,我需要“子”程序运行十次,并且更快地完成任务。因此,我运行子程序十次,并为每个程序提供单独的范围进行检查。
两个程序都可以正常运行,但我希望它们可以相互运行/报告,而且希望在数据传输的子母侧尤其不要使用文件“传输”来完成任务。目前,“母”程序如下:
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()

'Child'程序
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个月没有接触它主要是因为不知道该怎么做。之前的一些研究表明这远远超出了我的能力范围。我从未涉及过线程/套接字/客户端/服务器交互,所以在这种情况下我很蠢。无论我在Google上搜索什么都会回到stackoverflow。
是的,我想要同时运行10个程序副本,以节省时间。如果程序能向“主机”返回报告信息,而“主机”可以将当前搜索值打印到屏幕上,那么我可以不需要GUI界面。同时,如果子级可以报告自己何时完成,以及它是否成功下载任何文件(相对于由于文件太小而下载然后被删除),我将使用成功的下载信息来更新Highest.txt,以便下次运行程序时使用。
我认为这可以更好地澄清问题...或者我不理解使用服务器/客户端交互的本质:) 程序中唯一需要time.sleep的原因是为了确保在运行下一个子程序实例之前可以写入文件。我不确定会遇到什么样的时间问题,所以为了安全起见,我包括了这些行。

2
伙计,加一些换行吧。这样读起来很痛苦。 - Blorgbeard
2个回答

6
这可以通过使用多进程库实现简单的客户端/服务器拓扑结构来完成。使用您的母/子术语: 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

2
那么假设语言不同,一个人可以在本地TCP端口之外使用这个所谓的多进程通信行为来连接不同的任务吗?因为我一直在使用它(用于非TCP连接),在这种情况下,上述协议的技术名称是什么? - Abr001am
它比使用套接字或管道更好吗?我在这里阅读到了相关信息:https://dev59.com/aWMm5IYBdhLWcg3wX-HT#31756908 - baptx

1
当你谈论使用txt在程序间传递信息时,首先需要知道你使用的是什么语言。 在我对Java和Python的了解中,无论信息量有多大,都可以通过繁琐的依赖实现。 在Python中,你可以使用其自带的库读写txt并进行计划执行,你可以使用apscheduler。

4
问题标题写着“Python”。 - jscs
1
另一种语言,这样人们可以为您提供更具体的答案并利用您的知识进一步完善答案。 - Felipe Cabral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接