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

Merge two URLs inside a os.system subrprocess in python

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

预期是从 SVN 检出文件并对其进行修补。首先,用户将输入 url,第二个输入将是存储库中的文件名。我想将文件导出到我的本地系统。我有这样的代码,

 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.

中用 / 分隔

正如评论中已经指出的那样,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)