Python: os.system 的输入被拆分

Python: input to os.system getting split

我希望将列表列表作为参数传递给我的 python 程序。当我在普通 shell 上做同样的事情时,它工作得很好,但是当我在 os.system 上做同样的事情时,它只是拆分了我的列表

import sys
import json
import os
#path=~/Desktop/smc/fuzzy/
os.system("test -d results || mkdir results")
C1=[-5,-2.5,0,2.5,5];spr1=2.5;LR1=[10,20,30,30,30]
C2=[-4,-3,-2,-1,0,1,2,3,4];spr2=1;LR2=[30,40,50,50,50]
C3=[-4,-2,0,2,4];spr3=2;LR3=[40,50,60,60,60]
arg=[[spr1,LR1,C1],[spr2,LR2,C2],[spr3,LR3,C3]]
for i in range(len(arg)):
    print ('this is from the main automate file:',arg[i])
    print('this is stringized version of the input:',str(arg[i]))
    inp=str(arg[i])
    os.system("python "+"~/Desktop/smc/fuzzy/"+"name_of_my_python_file.py "+ inp)   
    os.system("mv "+"*_"+str(arg[i])+" results")

这是它抛出的错误-

('this is from the main automate file:', [2.5, [10, 20, 30, 30, 30], [-5, -2.5, 0, 2.5, 5]])
('this is stringized version of the input:', '[2.5, [10, 20, 30, 30, 30], [-5, -2.5, 0, 2.5, 5]]')
('from the main executable file:', ['/home/amardeep/Desktop/smc/fuzzy/name_of_my_python_file.py', '[2.5,', '[10,', '20,', '30,', '30,', '30],', '[-5,', '-2.5,', '0,', '2.5,', '5]]'])

在第三行中,它只是用逗号分隔列表,因此弄乱了列表。有什么办法可以绕过这个吗? 而不是像这样传递一个整洁的列表列表:

[2.5, [10, 20, 30, 30, 30], [-5, -2.5, 0, 2.5, 5]]

它正在传递类似

的内容
[2.5,', '[10,', '20,', '30,', '30,', '30],', '[-5,', '-2.5,', '0,', '2.5,', '5]]']

我需要能够将列表列表作为参数传递给我的 python 程序。

  1. 不要使用 os.system,它已被弃用,无法用引号等参数组成正确的命令行...(因为 inp 包含空格,您需要引号,并且它很快就会变得一团糟)
  2. 当你有 shutil.move
  3. 时不要使用 mv

我的建议:使用 subprocess.check_call (python <3.5),使用 os.path.expanduser 可以计算 ~ 而不需要 shell=True:

import subprocess
subprocess.check_call(["python",
           os.path.expanduser("~/Desktop/smc/fuzzy/name_of_my_python_file.py"),inp])

将参数作为参数列表传递允许 check_call 在需要时处理引用。

现在,要移动文件,请在 globbed 文件上使用循环和 shutil:

import glob,shutil
for file in glob.glob("*_"+str(arg[i])):
   shutil.move(file,"results")

但是,在较长的 运行 中,由于您从 python 程序调用 python 程序并且您正在传递 python 列表,所以您最好使用简单的模块导入和函数调用,直接传递列表,而不是转换为字符串,你必须在子进程中解析它们。

目前的答案更适合 non-python 子流程。

顺便说一句,不要使用系统调用来创建目录:

os.system("test -d results || mkdir results")

可以用full-python代码代替,OS独立:

if not os.path.isdir("results"):
   os.mkdir("results")