【问题标题】:Merge two URLs inside a os.system subrprocess in python在 python 的 os.system 子进程中合并两个 URL
【发布时间】:2019-08-18 23:13:44
【问题描述】:

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

期望是从 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 中组合应该由 / 分隔的两个不同变量。

【问题讨论】:

标签: python os.system


【解决方案1】:

正如 cmets 中已经指出的,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)

【讨论】:

  • 我把filename小写了;在 Python 中,通常为类名保留正确的大小写。
  • 也许也可以参见stackoverflow.com/a/51950538/874188 了解更多关于 Python 中子进程的迷人主题。
  • Triplee,感谢您的解释。我试过这样运行,似乎运行不正常, from sys import argv import os import subprocess script,url=argv #urlpath =input('Enter the URL') #filename =input('Enter the filename with extension') subprocess.run(['svn', 'export', 'url'],check=True) 我在这里缺少什么?再次感谢!
  • 您仍在传递文字字符串'url'。参数在argv[1:];第零个参数包含脚本本身的名称。真正理解符号(变量或函数名)url和三个字符的字面序列'url'的区别。
  • 如果您在区分字符串和变量方面有困难,可以阅读stackoverflow.com/q/16116446/874188,但实际上您可能应该在尝试编写自己的程序之前完成基本教程。
猜你喜欢
  • 2011-09-12
  • 2021-06-10
  • 1970-01-01
  • 2015-08-10
  • 2012-03-15
  • 2016-05-23
  • 1970-01-01
  • 2016-08-24
  • 2017-07-24
相关资源
最近更新 更多