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

Posted

技术标签:

【中文标题】将值从一个 Python 程序传递到另一个程序【英文标题】:Passing values from one Python program to another 【发布时间】:2014-01-12 20:29:43 【问题描述】:

除了使用 .txt/dummy 文件之类的文件之外,是否有可能将值从一个程序传递到另一个程序?

我有一个程序使用 .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()

“儿童”计划

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 个月无所事事后,我正试图回来完成这件事,主要是因为不知道如何去做。在不久前的研究中,我发现这超出了我的想象。我从来没有对线程/套接字/客户端/服务器交互做过任何事情,所以在这种情况下我纯粹是个白痴。谷歌上的任何东西,我就被带回***。

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

我认为这可能会更好地澄清事情......或者我不理解使用服务器/客户端交互的性质:) time.sleep 在程序中的唯一原因是试图确保文件可以在子程序的下一个实例运行之前编写。我不确定我可能会遇到什么样的时间问题,所以为了安全起见,我将这些行包括在内。

【问题讨论】:

老兄。添加一些换行符。读起来很痛苦。 【参考方案1】:

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

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

【讨论】:

所以假设语言不同,一个人可以在除本地 tcp 端口之外的不同任务之间使用这种“所谓的多处理”相互通信行为吗?因为这是我一直使用的(用于非 tcp 连接),在这种情况下,afro提到的协议的技术名称是什么? 比使用套接字或管道更好吗?我在这里读到了:***.com/questions/17665124/…【参考方案2】:

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

在python中,可以使用自带的库读写txt和调度执行,可以使用apscheduler。

【讨论】:

问题标题为“Python”。 另一种语言,因此人们可以为您提供更具体的答案,并利用您的知识来增强答案。

以上是关于将值从一个 Python 程序传递到另一个程序的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从一个活动中的片段传递到另一个活动? [复制]

将值从一个组件传递到另一个组件

通过 Laravel 中的 AJAX 发布请求将值从一个视图传递到另一个视图

无法将值从一个意图传递到另一个意图

如何将值从一个片段的回收器视图项传递到另一个片段

如何使用会话将值从一个php页面传递到另一个页面