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 程序。
- 不要使用
os.system
,它已被弃用,无法用引号等参数组成正确的命令行...(因为 inp
包含空格,您需要引号,并且它很快就会变得一团糟)
- 当你有
shutil.move
时不要使用 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")
我希望将列表列表作为参数传递给我的 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 程序。
- 不要使用
os.system
,它已被弃用,无法用引号等参数组成正确的命令行...(因为inp
包含空格,您需要引号,并且它很快就会变得一团糟) - 当你有
shutil.move
时不要使用
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")