在python中的os.system子进程内合并两个URL

问题描述 投票:0回答:1

我是Python的新手。我正在尝试自动化修补活动。

期望是从SVN签出文件并对其进行修补。首先,用户将输入URL,第二个输入将是存储库中的文件名。我想将文件导出到我的localsystem。我有这样的代码,

 import os
 urlpath =input('Enter the URL')
 Filename =input('Enter the filename with Extension')
 os.system("svn export 'urlpath'+'/'+'Filename'")

输入:https://svn.abcdf.xyz文件名:utility.java

代码应该从https://svn.abcdf.xyz/utility.java导出文件。

有没有其他方法可以做到这一点?或者如何组合两个不同的变量,这些变量应该由os.system分隔。

python os.system
1个回答
0
投票

正如评论中已经指出的那样,os.system的论点只是一个字符串;所以你要使用Python的常规字符串格式化功能来创建它。

import os
urlpath = input('Enter the URL')
filename = input('Enter the filename with extension')
os.system("svn export '{0}/{1}'".format(urlpath, filename))

但是,您可能应该更喜欢在subprocess.run文档中强烈暗示的os.system

import subprocess
urlpath = input('Enter the URL')
filename = input('Enter the filename with extension')
subprocess.run(['svn', 'export', urlpath+'/'+filename],
    check=True)

使用check=True,如果命令失败,你会得到一个明确的错误(os.system只会告诉你通过你没有检查的退出状态),而且因为我们不使用shell=True,所以这应该快一点。还要注意第一个参数是一个标记列表,而不是一个shell必须再次分开的字符串(记住,现在这里没有shell)。

subprocess.run()是在Python 3.5中引入的;如果你需要支持旧版本,可以探索用subprocess.check_call()替换它

一个更好的设计将摆脱交互式input调用,并允许用户传入参数作为命令行参数(sys.argv);这样,您就可以使用shell的历史记录和文件名完成功能,因此您无需手动完整地键入文件名,并且可以轻松调用最近使用过的文件。这也使得围绕脚本构建额外的自动化成为可能,因为程序可以轻松地驱动其他程序。

import sys
import subprocess
import logging

if len(sys.argv) != 3:
    logging.error('syntax: {0} baseurl filename'.format(
        sys.argv[0].split('/')[-1}))
    sys.exit(2)

urlpath = sys.argv[1]
filename = sys.argv[2]
subprocess.run(['svn', 'export', urlpath+'/'+filename],
    check=True)
© www.soinside.com 2019 - 2024. All rights reserved.