Python 如何在另一个文件中使用subprocess.run来回显(bash)
我正在学习python并决定编写此脚本,但由于任何原因,带有echo的行都无法工作。 谁能给我解释一下原因吗Python 如何在另一个文件中使用subprocess.run来回显(bash),python,python-3.x,linux,bash,subprocess,Python,Python 3.x,Linux,Bash,Subprocess,我正在学习python并决定编写此脚本,但由于任何原因,带有echo的行都无法工作。 谁能给我解释一下原因吗 #!/usr/bin/env python3.5 import sys import subprocess if len(sys.argv) == 1 : sys.exit() file_name = sys.argv[1] + '.py' res = subprocess.run(['touch', file_name]) res = subprocess.run(['
#!/usr/bin/env python3.5
import sys
import subprocess
if len(sys.argv) == 1 :
sys.exit()
file_name = sys.argv[1] + '.py'
res = subprocess.run(['touch', file_name])
res = subprocess.run(['chmod', '744', file_name])
res = subprocess.run(['chown', 'user', file_name])
res = subprocess.run(['echo', '\'#!/usr/bin/env python3.5\'', '>>', file_name])
谢谢。
是一个shell操作符;要使用它,您需要将str
传递到run
而不是一系列参数,并传递shell=True
以使其在子shell中执行,例如,使其不完全不可能不稳定/不安全:
res = subprocess.run(f'echo \'#!/usr/bin/env python3.5\' >> {shlex.quote(file_name)}', shell=True)
也就是说,不要这样做。您不需要使用子流程来完成这些工作,因为Python内置将完成相同的工作,并且比使用子流程快得多:
with open(file_name, 'w') as f:
os.chmod(f.fileno(), 0o744)
shutil.chown(f.fileno(), 'user')
f.write('#!/usr/bin/env python3.5\n')
>
是一个shell操作符;要使用它,您需要将str
传递到run
而不是一系列参数,并传递shell=True
以使其在子shell中执行,例如,使其不完全不可能不稳定/不安全:
res = subprocess.run(f'echo \'#!/usr/bin/env python3.5\' >> {shlex.quote(file_name)}', shell=True)
也就是说,不要这样做。您不需要使用子流程来完成这些工作,因为Python内置将完成相同的工作,并且比使用子流程快得多:
with open(file_name, 'w') as f:
os.chmod(f.fileno(), 0o744)
shutil.chown(f.fileno(), 'user')
f.write('#!/usr/bin/env python3.5\n')
>文件
是一条指令,指示shell将stdout重定向到文件
。如果在不使用shell=True
的情况下使用subprocess
,则根本没有shell,因此您需要使用stdout=
参数自己进行重定向:
res = subprocess.run(['echo', '#!/usr/bin/env python3.5'], stdout=open(file_name, 'a'))
您会注意到,我还从您的回音中取出了额外的\'
s。这是因为这些字符串也是shell的指令(告诉shell不要更改任何字符串内容);由于没有外壳,这些指令不再需要
当然,永远不要这样做;只需用本机Python写入文件。>file
是一条指示shell将stdout重定向到文件的指令。如果在不使用shell=True
的情况下使用subprocess
,则根本没有shell,因此您需要使用stdout=
参数自己进行重定向:
res = subprocess.run(['echo', '#!/usr/bin/env python3.5'], stdout=open(file_name, 'a'))
您会注意到,我还从您的回音中取出了额外的\'
s。这是因为这些字符串也是shell的指令(告诉shell不要更改任何字符串内容);由于没有外壳,这些指令不再需要
当然,永远不要这样做;只需用本机Python写入文件。会发生什么?您试图调试该问题的原因是什么?
是一个shell管道符号,而不是echo
的参数。有没有任何理由让您尝试像使用shell一样使用externals程序,而不是使用Python自己的特性?例如,open
触摸并写入文件,以及os.chmod
和os.chown
?我不是问os.system
,这只是另一种生成子进程的方法。我问你为什么要使用子进程,看看Python是如何独立完成所有这些任务的——即通过open
、os.chmod
、和os.chown
。你试着调试这个问题吗?给出了哪个返回码?您是否尝试过该执行是否会在shell上返回某些内容?或者只是>somefile.py
,它本身会清空文件(而touch
如果启动时文件不为空,则会将其现有内容保留在那里)。会发生什么情况?您试图调试该问题的原因是什么?
是一个shell管道符号,而不是echo
的参数。有没有任何理由让您尝试像使用shell一样使用externals程序,而不是使用Python自己的特性?例如,open
触摸并写入文件,以及os.chmod
和os.chown
?我不是问os.system
,这只是另一种生成子进程的方法。我问你为什么要使用子进程,看看Python是如何独立完成所有这些任务的——即通过open
、os.chmod
、和os.chown
。你试着调试这个问题吗?给出了哪个返回码?您是否尝试过该执行是否会在shell上返回某些内容?或者只是>somefile.py
,它本身会清空文件(而touch
如果启动时文件不为空,则会将其现有内容保留在那里)。为什么shell=True
,而不是stdout=open(…)
?如果不小心使用,就不会出错(有人将shlex.quote()
s与shell=True
一起省略,可能会造成很大的混乱)。@CharlesDuffy:因为在这两种情况下使用子流程都是错误的,所以显示哪种错误的解决方案并不重要?:-)我向他们展示了如何使用shell元字符来完成他们正在尝试的任务,然后接着是“但永远不要这样做”。使用open
而不使用shell=True
更安全,但是使用echo
子进程是很奇怪的,因为直接写入文件总是比较容易。@ShadowRanger非常感谢。。。知道了。我写python大约有10分钟;-)所以…@CharlesDuffy谢谢你,为什么shell=True
,而不是stdout=open(…)
?如果不小心使用,就不会出错(有人将shlex.quote()
s与shell=True
一起省略,可能会造成很大的混乱)。@CharlesDuffy:因为在这两种情况下使用子流程都是错误的,所以显示哪种错误的解决方案并不重要?:-)我向他们展示了如何使用shell元字符来完成他们正在尝试的任务,然后接着是“但永远不要这样做”。使用open
而不使用shell=True
更安全,但是使用echo
子进程是很奇怪的,因为直接写入文件总是比较容易。@ShadowRanger非常感谢。。。知道了。我写python大约有10分钟;-)所以…@CharlesDuf