Python 如何在另一个文件中使用subprocess.run来回显(bash)

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(['

我正在学习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(['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