在一个文件中对另一个python程序执行多次,并每次传入不同的参数

问题背景及描述

最近在看一篇关于神经风格迁移的论文,在复现论文代码时,源代码一共只有一个文本文件,如果希望对多张图片进行不同的StyleTransfer操作则比较困难,因为图片路径、大小,希望迁移的风格图(Style和Content)等都不一样。

与此同时,源代码的python文件编写地并不是很规范,函数片段之间有局部的代码片段,变量之间相互引用比较混乱,且没有编写main函数,导致无法通过函数调用方式对同一段程序进行多次执行。

为了解决这个问题,我进行了两步操作。
第1步-批量resize了图片的大小,这对模型训练、服务器接收数据都有好处(图片太大GPU可能会崩掉),这个在另一篇文章中也有所介绍。
第2步-解决了在基本不改变源码的情况下,直接对源码文件进行多次执行,避免了重复与命令行交互之类的手动操作。同时,做到了每次调用都可以按照自己的需要传入相应的参数,实现了对不同路径的图片都同样处理;用相似的思路,也可以实现对不同的Content图片,传入与之对应的Style图片与之对应并进行风格迁移。

问题推广

推广这个问题,用同样的方法,可以解决在一个python程序里多次调用另一个的python程序,并在每次提供不同参数的问题。

代码片段解释

片段一:


def read_directory(directory_name):
	#记得import os
    for filename in os.listdir(r"./" + directory_name):
        content_dirs.append(filename)
    return content_dirs

这个片段用于返回同一个文件夹下所有图片的名称。

片段二:

def main():
    Process_dir = 'content_pic'
    c_dirs = read_directory(Process_dir)
    for c_dir in c_dirs:
    #记得import cv2
        pro_dir = Process_dir+'/'+c_dir
        img_array = cv2.imread(pro_dir, cv2.IMREAD_COLOR)
        resize_img = cv2.resize(img_array, (512, 512), interpolation=cv2.INTER_CUBIC)
        cv2.imwrite(resize_img_dir+c_dir, resize_img)
    return c_dirs

这个片段用于将’content_pic’文件夹下面所有的图片resize为(512,512)大小。处理完之后全部保存在resize_img_dir对应的文件夹下,图片名称不变。

片段三:批量调用的部分(在你的问题上推广使用)

if __name__ == "__main__":
    content_pic_lists = main()
    cnt = 0
    for content_pic_list in content_pic_lists:
        cr = resize_img_dir+content_pic_list
        print(cr)
        cnt = cnt + 1
        print("********************************正在处理第",cnt,"张图片********************************")
        os.system(r'python ./StyleTransfer.py %s' % cr)

核心代码就是下面这一段:

os.system(r'python ./StyleTransfer.py %s' % cr)

如果你想在你的程序里实现类似的功能,可以更改以下参数:

os.system(r'python ./文件名.py %s %s ...' %(x,y...))

1.文件名更改为你自己的文件名(记得路径要对应)
2.%s %s是传入的参数,%(x,y)与之对应,这种情况就是传入两个参数;
如果写成 os.system(r’python ./xxx.py %s’ % x )就是传入一个参数。

片段四:被调用的文件(接受不同参数)

import sys
content_pic_name = sys.argv[1]

如果你只传入了一个参数,那么这样写就会把这个参数传进变量中,如果传入两个参数,稍微更改即可:

import sys
x = sys.argv[1]#第一个参数
y = sys.argv[2]#第二个参数

完整代码

文件一 main.py(批量处理的文件)

import os
import cv2

content_dirs = []
resize_img_dir = 'resize_pic/'

def read_directory(directory_name):
    for filename in os.listdir(r"./" + directory_name):
        #content_dir = directory_name + '/' + filename
        #content_dirs.append(content_dir)
        content_dirs.append(filename)
    return content_dirs


def main():
    Process_dir = 'content_pic'
    c_dirs = read_directory(Process_dir)
    for c_dir in c_dirs:
        pro_dir = Process_dir+'/'+c_dir
        img_array = cv2.imread(pro_dir, cv2.IMREAD_COLOR)
        resize_img = cv2.resize(img_array, (512, 512), interpolation=cv2.INTER_CUBIC)
        cv2.imwrite(resize_img_dir+c_dir, resize_img)
    return c_dirs


if __name__ == "__main__":
    content_pic_lists = main()
    cnt = 0
    for content_pic_list in content_pic_lists:
        cr = resize_img_dir+content_pic_list
        print(cr)
        cnt = cnt + 1
        print("********************************正在处理第",cnt,"张图片********************************")
        os.system(r'python ./StyleTransfer.py %s' % cr)

文件二(被调用的文件)

import sys
x = sys.argv[1]
#y = sys.argv[2]
#之后对x,y进行相应处理即可
...
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是一个用Python编写的简单的多秒杀程序示例: ```python import threading import time class Killer(threading.Thread): def __init__(self, num): threading.Thread.__init__(self) self.num = num def run(self): print("线程%s开始" % self.num) for i in range(5): print("线程%s 第%s秒" % (self.num, i)) time.sleep(1) print("线程%s结束" % self.num) if __name__ == "__main__": thread_list = [] for i in range(3): thread = Killer(i) thread_list.append(thread) for thread in thread_list: thread.start() for thread in thread_list: thread.join() ``` 这个程序创建了一个名为Killer的类,并从threading.Thread继承了该类。类有一个run()方法,它实现了线程的主要逻辑。在主程序,我们创建了3个Killer对象,并将它们添加到一个线程列表。然后,我们依次启动每个线程,并等待它们完成。 每个Killer线程执行5次循环,每次循环都打印出线程号和当前秒数,并睡眠1秒钟。运行这个程序,你应该会看到类似下面的输出: ``` 线程0开始 线程1开始 线程2开始 线程0 第0秒 线程1 第0秒 线程2 第0秒 线程0 第1秒 线程1 第1秒 线程2 第1秒 线程0 第2秒 线程1 第2秒 线程2 第2秒 线程0 第3秒 线程1 第3秒 线程2 第3秒 线程0 第4秒 线程1 第4秒 线程2 第4秒 线程0结束 线程1结束 线程2结束 ``` ### 回答2: 拼多多秒杀程序是指通过编写程序利用Python语言实现自动化抢购拼多多商品的功能。 要编写一个拼多多秒杀程序,首先需要使用Python的相关库去模拟浏览器的行为,比如使用selenium库来模拟浏览器窗口的打开、关闭、点击等操作。接下来,在程序需要传入商品链接,使用这个链接可以获取拼多多商品的信息。 在秒杀的过程,需要使用Python编写逻辑来模拟拼多多秒杀页面的各种操作,包括登录账号、选择商品、确定数量、添加商品到购物车、选择收货地址、选择支付方式等。可以使用selenium库提供的方法实现自动化操作。同时,还需要结合时间设置,以确保活动开启之前就已经登录,并在开抢的瞬间点击购买按钮。 秒杀程序的关键是要尽可能地提升操作速度,提前获取商品信息、设置好目标购买的商品、使用多线程提高操作效率等都是可以考虑的优化方式。另外,还可以加入验证码的自动识别功能,提高抢购成功的概率。 最后,为了更好地保护用户账号的安全,在编写程序时要注意隐私信息的保护,不要把敏感信息写死在代码或者在网络传输时使用明文。可以使用配置文件或者加密算法来保护账号和密码的安全。 总之,编写拼多多秒杀程序需要使用Python的相关库和模块,同时需要对拼多多页面的结构和操作流程进行深入了解。编写程序的关键是提高抢购效率和保护用户账号的安全。 ### 回答3: 拼多多是一家网购平台,拥有很多人抢购商品的活动,秒杀成功率很低。使用Python编写一个拼多多秒杀程序可以提高秒杀成功的概率。 首先,需要安装Python的相关库,如requests、selenium等。然后,使用requests库发送HTTP请求,模拟用户登录拼多多网站。可以使用用户名和密码登录,也可以使用手机号和验证码登录。 接下来,使用selenium库模拟浏览器的行为。首先,需要创建一个浏览器对象,然后使用该对象打开拼多多的商品详情页。可以根据商品的链接来打开对应的商品详情页。 在打开商品详情页后,需要通过selenium库找到“立即购买”或“抢购”按钮的元素,并点击该元素。可以使用Xpath或CSS选择器来定位元素。 当点击“立即购买”或“抢购”按钮后,可能会要求输入验证码。这时,程序可以暂停一段时间,等待用户手动输入验证码或调用第三方验证码解决平台。 最后,需要通过selenium库模拟用户选择收货地址、支付方式等操作。可以通过选择下拉框、填写表单等方式来完成这些操作。 需要注意的是,拼多多有反爬虫机制,所以需要降低爬虫的频率,模拟真实用户的行为,避免被检测到。 总的来说,Python编写一个拼多多秒杀程序需要使用requests库模拟登录和发送HTTP请求,使用selenium库模拟浏览器行为,选择商品、添加购物车、填写地址等。同时还需要注意拼多多的反爬虫机制,尽量模拟真实用户的行为,提高秒杀成功的概率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值