执行子进程在 Windows 上找不到指定的文件
Executing subprocess cannot find specified file on Windows
我在一个有 Jython2.5 的系统中工作,但我需要能够调用一些 Google 的 API,所以我写了一个离线脚本,我想从我的 Jython 环境中调用它和 return 给我的小数据。像 JobID 或 sheet URL 或来自 Google.
的东西
我尝试了很多方法,但我总是从 Windows 收到错误消息,说找不到指定的文件。
路径有两种方式。
第一种使用字符串的方式
stringPath = r"C:\GooglePipes\Scripts\filetobq.py C:\GooglePipes\Keys\DEV-BigQueryKey.json nofile C:\GooglePipes\BQ_Downtime\TESTFILE.CSV dataset1 table1"
第二种方式,作为一个序列(根据文档,使用 shell=false
提供一个序列)
seqPath = [r"C:\GooglePipes\Scripts\filetobq.py",r"C:\GooglePipes\Keys\DEV-BigQueryKey.json","nofile",r"C:\GooglePipes\BQ_Downtime\TESTFILE.CSV","dataset1","table1"]
调用
data, err = Popen(seqPath, shell=True, stderr=PIPE, stdout=PIPE).communicate()
#Read values back in
print data
print err
将 seqPath
替换为 stringPath
以尝试任一方式。
我整个周末都在这,每次我 运行 我从 Windows
The system cannot find the path specified.
来自 err
打印。我无法进行比这更进一步的调试。我不太确定发生了什么。当我将 stringPath
变量直接粘贴到计算机的命令 window 中时,它会执行。
我还调用了 subprocess.list2cmdline(seqPath)
以查看其输出的内容。它给了我一个?在字符串前面,但我一直无法弄清楚那是什么意思。我可以将字符串的其余部分从问号后开始粘贴到命令 window 中并执行。
?C:\GooglePipes\Scripts\filetobq.py C:\GooglePipes...
我在 shell 上尝试了许多不同的 true 和 false 组合,将不同的 args 传递给 Popen
,双斜线,并且我从堆栈溢出中打开不少于 30 个选项卡和其他帮助论坛。我只是不知道此时该做什么,感谢您的帮助。
编辑
那个?当我进行一些额外的日志记录时,字符串开头实际上是一个 NULL 字符。这似乎是我问题的根源。我不明白为什么它会出现,但它出现在我的复制粘贴中。我开始手动打字,然后开始工作。当我用我的 Jython 程序提供路径时,它又出现了。
最终错误是 ?/NULL 字符。
我回到了程序正在抓取路径的源值,它就在那里。在我手动重新输入后,一切都开始工作了。
如果您复制并粘贴我在问题中输入的内容,并且通过字符串->ASCII 转换器运行,您可以在字符串中看到 NULL 字符。
>C:
>NULL 67 58
真是一堆废话***。
我在一个有 Jython2.5 的系统中工作,但我需要能够调用一些 Google 的 API,所以我写了一个离线脚本,我想从我的 Jython 环境中调用它和 return 给我的小数据。像 JobID 或 sheet URL 或来自 Google.
的东西我尝试了很多方法,但我总是从 Windows 收到错误消息,说找不到指定的文件。
路径有两种方式。
第一种使用字符串的方式
stringPath = r"C:\GooglePipes\Scripts\filetobq.py C:\GooglePipes\Keys\DEV-BigQueryKey.json nofile C:\GooglePipes\BQ_Downtime\TESTFILE.CSV dataset1 table1"
第二种方式,作为一个序列(根据文档,使用 shell=false
提供一个序列)
seqPath = [r"C:\GooglePipes\Scripts\filetobq.py",r"C:\GooglePipes\Keys\DEV-BigQueryKey.json","nofile",r"C:\GooglePipes\BQ_Downtime\TESTFILE.CSV","dataset1","table1"]
调用
data, err = Popen(seqPath, shell=True, stderr=PIPE, stdout=PIPE).communicate()
#Read values back in
print data
print err
将 seqPath
替换为 stringPath
以尝试任一方式。
我整个周末都在这,每次我 运行 我从 Windows
The system cannot find the path specified.
来自 err
打印。我无法进行比这更进一步的调试。我不太确定发生了什么。当我将 stringPath
变量直接粘贴到计算机的命令 window 中时,它会执行。
我还调用了 subprocess.list2cmdline(seqPath)
以查看其输出的内容。它给了我一个?在字符串前面,但我一直无法弄清楚那是什么意思。我可以将字符串的其余部分从问号后开始粘贴到命令 window 中并执行。
?C:\GooglePipes\Scripts\filetobq.py C:\GooglePipes...
我在 shell 上尝试了许多不同的 true 和 false 组合,将不同的 args 传递给 Popen
,双斜线,并且我从堆栈溢出中打开不少于 30 个选项卡和其他帮助论坛。我只是不知道此时该做什么,感谢您的帮助。
编辑
那个?当我进行一些额外的日志记录时,字符串开头实际上是一个 NULL 字符。这似乎是我问题的根源。我不明白为什么它会出现,但它出现在我的复制粘贴中。我开始手动打字,然后开始工作。当我用我的 Jython 程序提供路径时,它又出现了。
最终错误是 ?/NULL 字符。
我回到了程序正在抓取路径的源值,它就在那里。在我手动重新输入后,一切都开始工作了。
如果您复制并粘贴我在问题中输入的内容,并且通过字符串->ASCII 转换器运行,您可以在字符串中看到 NULL 字符。
>C:
>NULL 67 58
真是一堆废话***。