运行 commands/programs 有子进程
Running commands/programs with subprocess
我是 python 中 subprocess
模块的新手。
文档提供了这个例子:
>>> subprocess.check_output(["echo", "Hello World!"])
b'Hello World!\n'
我试过的是:
>>> import subprocess
>>> subprocess.check_output(["cd", "../tests", "ls"])
/usr/bin/cd: line 4: cd: ../tests: No such file or directory
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/subprocess.py", line 620, in check_output
raise CalledProcessError(retcode, process.args, output=output)
subprocess.CalledProcessError: Command '['cd', '../tests', 'ls']' returned non-zero exit status 1
我很困惑,因为这是我的文件结构:
/proj
/cron
test_scheduler.py
/tests
printy.py
test1.py
test2.py
...
这些也是我的其他尝试:
>>> subprocess.check_output(["cd", "../tests", "python", "printy.py"])
/usr/bin/cd: line 4: cd: ../tests: No such file or directory
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/subprocess.py", line 620, in check_output
raise CalledProcessError(retcode, process.args, output=output)
subprocess.CalledProcessError: Command '['cd', '../tests', 'python', 'printy.py']' returned non-zero exit status 1
>>> subprocess.check_output(["cd", "../tests;", "ls"])
/usr/bin/cd: line 4: cd: ../tests;: No such file or directory
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/subprocess.py", line 620, in check_output
raise CalledProcessError(retcode, process.args, output=output)
subprocess.CalledProcessError: Command '['cd', '../tests;', 'ls']' returned non-zero exit status 1
tests
目录的相对路径取决于脚本的来源 运行。我建议打电话给 subprocess.check_output(["pwd"])
看看你在哪里。
此外,您不能像 ["cd", "../tests", "python", "printy.py"]
那样在同一个调用中组合两个命令。您需要分别使用 ["cd", "../tests"]
和 ["python", "printy.py"]
进行两次单独的调用。
我认为你在这里遗漏了一个论点。
这是我写过的唯一 python 脚本的片段:
#!/usr/local/bin/python
from subprocess import call
...
call( "rm " + backupFolder + "*.bz2", shell=True )
请注意该调用末尾的 shell=True
。
尽可能避免shell=True
。
这种情况,你当然可以避免。您面临的问题是:cd
是一个 shell 内置函数。它不是可以从外部调用的command/program/utility。您需要在 shell 范围内,cd
才能工作。您可以做的是更改当前目录。执行命令。然后回到原来的目录。
您需要执行以下操作:
pathBefore = os.getcwd()
os.chdir("/path/to/your/directory")
subprocess.check_output(["ls"])
os.chdir(pathBefore) # get back to the path we were in before
更新:。
错误信息很清楚:
/usr/bin/cd: line 4: cd: ../tests: No such file or directory
那是你已经成功启动了 /usr/bin/cd
失败并打印了错误信息的程序。
如果您想从 ../tests
目录 运行 ls
命令:
import os
import subprocess
cwd = os.path.join(get_script_dir(), '../tests')
output = subprocess.check_output(['ls'], cwd=cwd)
其中 get_script_dir()
.
注意:不要使用目录的相对路径 -- 您的脚本可以 运行 来自不同的目录 -- 在这种情况下,相对路径会失败。
我是 python 中 subprocess
模块的新手。
文档提供了这个例子:
>>> subprocess.check_output(["echo", "Hello World!"])
b'Hello World!\n'
我试过的是:
>>> import subprocess
>>> subprocess.check_output(["cd", "../tests", "ls"])
/usr/bin/cd: line 4: cd: ../tests: No such file or directory
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/subprocess.py", line 620, in check_output
raise CalledProcessError(retcode, process.args, output=output)
subprocess.CalledProcessError: Command '['cd', '../tests', 'ls']' returned non-zero exit status 1
我很困惑,因为这是我的文件结构:
/proj
/cron
test_scheduler.py
/tests
printy.py
test1.py
test2.py
...
这些也是我的其他尝试:
>>> subprocess.check_output(["cd", "../tests", "python", "printy.py"])
/usr/bin/cd: line 4: cd: ../tests: No such file or directory
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/subprocess.py", line 620, in check_output
raise CalledProcessError(retcode, process.args, output=output)
subprocess.CalledProcessError: Command '['cd', '../tests', 'python', 'printy.py']' returned non-zero exit status 1
>>> subprocess.check_output(["cd", "../tests;", "ls"])
/usr/bin/cd: line 4: cd: ../tests;: No such file or directory
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/subprocess.py", line 620, in check_output
raise CalledProcessError(retcode, process.args, output=output)
subprocess.CalledProcessError: Command '['cd', '../tests;', 'ls']' returned non-zero exit status 1
tests
目录的相对路径取决于脚本的来源 运行。我建议打电话给 subprocess.check_output(["pwd"])
看看你在哪里。
此外,您不能像 ["cd", "../tests", "python", "printy.py"]
那样在同一个调用中组合两个命令。您需要分别使用 ["cd", "../tests"]
和 ["python", "printy.py"]
进行两次单独的调用。
我认为你在这里遗漏了一个论点。
这是我写过的唯一 python 脚本的片段:
#!/usr/local/bin/python
from subprocess import call
...
call( "rm " + backupFolder + "*.bz2", shell=True )
请注意该调用末尾的 shell=True
。
尽可能避免shell=True
。
这种情况,你当然可以避免。您面临的问题是:cd
是一个 shell 内置函数。它不是可以从外部调用的command/program/utility。您需要在 shell 范围内,cd
才能工作。您可以做的是更改当前目录。执行命令。然后回到原来的目录。
您需要执行以下操作:
pathBefore = os.getcwd()
os.chdir("/path/to/your/directory")
subprocess.check_output(["ls"])
os.chdir(pathBefore) # get back to the path we were in before
更新:
错误信息很清楚:
/usr/bin/cd: line 4: cd: ../tests: No such file or directory
那是你已经成功启动了 /usr/bin/cd
失败并打印了错误信息的程序。
如果您想从 ../tests
目录 运行 ls
命令:
import os
import subprocess
cwd = os.path.join(get_script_dir(), '../tests')
output = subprocess.check_output(['ls'], cwd=cwd)
其中 get_script_dir()
.
注意:不要使用目录的相对路径 -- 您的脚本可以 运行 来自不同的目录 -- 在这种情况下,相对路径会失败。