Bash "Syntax error: end of file unexpected" when called from Python's (2.7) subprocess.call()

Bash "Syntax error: end of file unexpected" when called from Python's (2.7) subprocess.call()

我有一个 python (v2.7) 脚本需要在写入文件(如果存在)之前清除文件的内容。我能够在命令行上毫无问题地执行 'same' 命令,但是从 python 调用此命令的变体时出现 pythonbash 错误.不知道我错过了什么。

终极问题: 如何使用来自 Python (v2.7) 的系统调用创建一个空文件(或清除,如果存在)?

Bash(成功创建空文件或清除现有文件)

$ > test.txt
$ ls -l test.txt
-rw-rw-r--+ 1 <owner> <group> 0 Feb  9 11:26 test.txt

Python(w/o `shell=True';失败并出现错误)

我在没有使用 shell=True 的情况下收到以下错误:OSError: [Errno 2] No such file or directoryAnother post 建议如果我将所有参数作为单独的字符串参数传递,我不应该得到这个错误。不确定为什么会出现此错误。

$ python
>>> import subprocess
>>> subprocess.call(['>', 'test.txt']) # Same result w/ single/double quotes
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 172, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 394, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1047, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Python(带“shell=True”;失败并出现错误)

我尝试根据其他 post 的建议添加 shell=True(应该不会有安全风险,因为该命令是静态的),但我收到以下 bash 错误:Syntax error: end of file unexpected。我认为它可能需要一个结尾 ;(可能是因为 python 是如何调用的?),所以我尝试了两次添加一个 ; 参数,但最终结果相同。

$ python
>>> import subprocess
>>> subprocess.call(['>', 'test.txt'], shell=True) # Same result w/ single/double quotes
test.txt: 1: test.txt: Syntax error: end of file unexpected
2
>>> import subprocess
>>> subprocess.call(['>', 'test.txt', ';'], shell=True)  # Same result w/ single/double quotes
test.txt: 1: test.txt: Syntax error: end of file unexpected

shell=True 错误

使用它时,给出的命令将被格式化为一个字符串

然后将给出的命令字符串解释为原始 shell 命令

正确的用法应该是这样的:

>>> import subprocess
>>> subprocess.call('> test.txt', shell=True)
0
>>> 
# There will now be an empty file called
# 'test.txt' in the same directory 

shell=False 错误

您 运行ning 的命令本来是 运行 在 shell 的 之上,但是当使用这种方式时,它会尝试 运行 您的字符串,方法是将其调用为在您的 PATH

中找到的命令

但是,我不知道如何解决你的这部分问题。