【问题标题】:Calling batch commands from python从 python 调用批处理命令
【发布时间】:2021-11-30 21:32:28
【问题描述】:

我使用 python 和一些外部程序 API 来自动化一些东西。 请记住,这些“extpro”和“--file”和“--dont-breakaway-from-job”是我必须使用的内置命令,我的代码如下所示:

send = os.system('extpro --file '(os.path.join(base_dir, extpr_path))' --dont-breakaway-from-job')

我得到的错误是在 --dont-breakaway-from-job 上,说 Expected ")" pylance。

但是当我尝试这个时没有错误:

send = os.system('extpro --file "C:/user/program/run.exe" --dont-breakaway-from-job')

有人知道这种行为背后的原因吗? 有没有办法将整个命令分成两个或三个?

欢迎任何建议,谢谢!

【问题讨论】:

    标签: python python-3.x api batch-file cmd


    【解决方案1】:

    如果我理解正确,问题是你需要用引号连接字符串吗?如果是这种情况,您可以使用以下

    send = os.system("extpro --file \""+os.path.join(base_dir, extpr_path)+"\" --dont-breakaway-from-job")
    

    os.path.join 返回一个需要使用 + 连接的字符串。此外,您需要在os.path.join 周围加上引号。这可以通过多种方式实现,但我在此答案中使用的是\"。

    【讨论】:

      【解决方案2】:

      您的send = os.system('extpro --file '(os.path.join(base_dir, extpr_path))' --dont-breakaway-from-job') 行不会创建您期望/需要的字符串,也不会将'extpro --file ' 与文件路径(在"! 内)和' --dont-breakaway-from-job' 连接起来。

      最简单的解决方案可能是使用 F 字符串:

      send = os.system(f'extpro --file "{os.path.join(base_dir, extpr_path)}" --dont-breakaway-from-job')
      

      这里重要的是将" 添加到字符串中,因为os.path.join(...) 不会使用" 创建字符串。

      【讨论】:

        【解决方案3】:

        os.path.join 返回str 对象,因此您的

        'extpro --file '(os.path.join(base_dir, extpr_path))' --dont-breakaway-from-job'
        

        扩展为:

        'extpro --file '"<whatever that path is>"' --dont-breakaway-from-job'
                       ^                                    
        

        在标有^ 的位置,字符串结束。而且,由于os.system 只需要一个参数,pylance(和解释器)假设这个参数已经被传递并抛出一个错误,所以需要右括号。

        解释器不会将os.path.join 结果与前面的字符串连接起来,因为它不知道os.path.join 是一个字符串。函数调用只会在运行时变成字符串。

        但是,您的第二个变体包含'some str "inner str" some more'。 Python 解释器看到以'(单引号)开头的字符串并寻找匹配的对,这意味着字符串的结尾。单引号之间的所有"(双引号)都被视为字符串的一部分。

        解决方案很简单。您可以执行以下任何操作:

        # Concatenating strings with +
        send = os.system('extpro --file "'+ os.path.join(base_dir, extpr_path) + '" --dont-breakaway-from-job')
        # Using format (or f-strings, ifyou're using python 3.6+)
        send = os.system('extpro --file "{}" --dont-breakaway-from-job'.format(os.path.join(base_dir, extpr_path)))
        # or
        send = os.system(f'extpro --file "{os.path.join(base_dir, extpr_path)}" --dont-breakaway-from-job')
        

        在 3 种变体中的任何一种中,都值得将 os.path.join 结果用 "(双引号)括起来,以防它包含可能被错误解析的空格或其他不需要的符号

        【讨论】:

          猜你喜欢
          • 2020-10-02
          • 1970-01-01
          • 2012-09-05
          • 2019-09-03
          • 1970-01-01
          • 2010-09-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多