Python 无法通过subprocess.Popen运行shell脚本
我正在尝试使用pythonPython 无法通过subprocess.Popen运行shell脚本,python,python-3.x,Python,Python 3.x,我正在尝试使用python子流程运行脚本run.sh 该脚本创建一个csv文件和一个state.json文件 这是脚本(从终端运行时工作正常): 但是当我尝试从python运行相同的代码时,它显示了正确的输出,但没有创建csv文件和state.json文件 这是python代码 #!/usr/bin/python3 import subprocess from ast import literal_eval import io import os from subprocess impo
子流程运行脚本run.sh
该脚本创建一个csv文件
和一个state.json
文件
这是脚本(从终端运行时工作正常):
但是当我尝试从python运行相同的代码时,它显示了正确的输出,但没有创建csv文件和state.json文件
这是python代码
#!/usr/bin/python3
import subprocess
from ast import literal_eval
import io
import os
from subprocess import call
shellscript = subprocess.Popen(["/home/anti/Documents/bq_s3/run.sh"], stdout=subprocess.PIPE)
shellscript.wait()
print (shellscript.returncode)
输出
INFO Sending version information to singer.io. To disable sending anonymous usage data, set the config parameter "disable_collection" to true
INFO Running query:
SELECT start_date,trip_seconds,trip_miles FROM `testbq-305217.test_1.tablename` WHERE 1=1 AND datetime '2013-01-01 00:00:00.000000' <= CAST(start_date as datetime) AND CAST(start_date as datetime) < datetime '2013-01-02 00:00:00.000000' ORDER BY start_date LIMIT 100
INFO METRIC: {"type": "counter", "metric": "record_count", "value": 1, "tags": {"endpoint": "test_bq"}}
INFO Syncing stream:test_bq
0
INFO将版本信息发送到singer.io。要禁用发送匿名使用数据,请将配置参数“disable_collection”设置为true
运行查询的信息:
从“testbq-305217.test_1.tablename”中选择开始日期、行程秒数、行程英里数,其中1=1和日期时间“2013-01-01 00:00:00.000000”,正如您在评论中提到的,因为问题是当前工作目录未正确设置,请将cwd
参数传递到子流程.Popen
。更好的方法是,按照文档中的建议,使用更高级别的函数替换subprocess.Popen()
#!/usr/bin/python3
import subprocess
shellscript = subprocess.call(["/home/anti/Documents/bq_s3/run.sh"], cwd=YOUR_WORKING_DIR)
print(shellscript)
打开set-x
时,您会看到什么?在哪里执行此操作?在Popen
内部发现问题,文件是在home
目录中创建的,而不是在cwd中创建的。如何更改输出路径?您可以在脚本内部执行显式的set-x
,也可以修改Popen
,使其有效地运行命令bash-x run.sh
,而不是简单的run.sh
。我建议您在一个新问题中问这个问题,因为这与Python或bash不再相关,但是要正确使用目标csv
。因此,这个问题应该转到而不是。问题是输出文件是在主目录中创建的,而不是在cwd
中创建的。输出路径需要更改为cwd
,无论如何,我可以在脚本中执行此操作?您实际上可以将cwd
传递给subprocess.Popenthat worked man..谢谢..编辑您的答案,以便我可以接受它
#!/usr/bin/python3
import subprocess
shellscript = subprocess.call(["/home/anti/Documents/bq_s3/run.sh"], cwd=YOUR_WORKING_DIR)
print(shellscript)