首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将值从一个Python程序传递到另一个Python程序

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

Stack Overflow用户
提问于 2014-01-13 04:29:43
回答 2查看 4.3K关注 0票数 5

除了使用.txt/虚拟文件之外,是否可以将一个值从一个程序传递到另一个程序?

我有一个程序,它使用.txt文件将起始值传递给另一个程序。每次运行程序时,我都会在两次启动之间更新文件中的值(十次,基本上是同时进行的)。这样做很好,但我想让“孩子”程序在完成时向“母亲”程序报告,并报告它发现要下载的文件。

有没有可能在不使用11个文件的情况下做到这一点(即一个文件用于“孩子”到“母亲”的报告,一个文件用于“母亲”到“孩子”的报告)?我说的是完全独立的程序,而不是类或函数或类似的东西。

为了高效地运行,而不是等待几个小时才能完成所有的事情,我需要“孩子”程序运行十次,让事情做得更快。因此,我运行子程序十次,并给每个程序一个单独的范围来检查。

这两个程序都运行得很好,但我希望让它们彼此运行/报告,希望不是使用文件‘传输’来完成任务,特别是在数据传输的子母方。

“母亲”program...currently

代码语言:javascript
复制
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’程序

代码语言:javascript
复制
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或类。我试着回来,在半个月什么都不做之后完成它,主要是因为我不知道怎么做。在不久前的研究中,我发现这远远超出了我的理解。我从来没有做过线程/套接字/客户端/服务器交互的任何事情,所以在这种情况下我是个十足的笨蛋。谷歌上的任何东西,我只是被带回这里的stackoverflow。

是的,我想同时运行10个程序副本,以节省时间。如果程序可以将报告返回给“母亲”,这样母亲就可以在屏幕上打印正在搜索的当前值,那么我可以不使用gui界面。以及孩子是否可以在它完成时报告,以及它是否有任何成功下载的文件(而不是下载,然后由于太小而被擦除)。我将使用成功下载的信息来更新Highest.txt,以便下次运行程序时使用。

我认为这可能会澄清很多事情,better...that或者我不理解使用服务器/客户端交互的本质:) time.sleep出现在程序中的唯一原因是为了确保文件可以在子程序的下一个实例运行之前写入。我不确定我可能会遇到什么样的时间问题,所以为了安全起见,我把这些行包含进来了。

EN

回答 2

Stack Overflow用户

发布于 2014-01-13 04:55:55

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

server.py

代码语言:javascript
复制
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

代码语言:javascript
复制
from multiprocessing.connection import Client

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

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

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

运行时使用

代码语言:javascript
复制
$ python server.py
$ python client.py
票数 6
EN

Stack Overflow用户

发布于 2014-01-13 04:38:21

当您谈到使用txt在程序之间传递信息时,我们首先需要知道您使用的是什么语言。在我对Java和Python的了解中,achi是可行的,尽管费力地依赖于想要工作的信息量。

在python中,您可以使用随附的库来读取和写入txt并调度执行,您可以使用apscheduler。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21079929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档