Python FileNotFoundError:[Errno 2]尽管给出了完整的文件路径

时间:2019-07-11 17:53:21

标签: python popen python-3.7

因此,我编写了一段代码,该代码首先运行powershell命令以生成DAT文件的UTF-8版本(原始文件一直存在特殊字符问题,因此是该步骤)。接下来,我尝试打开新创建的文件。但是问题是,我不断收到'FileNotFoundError:[Errno 2]',最初,我只是尝试使用文件名,因为新创建的文件位于同一文件夹中,但是后来我也尝试生成绝对路径。

import os
import subprocess

subprocess.Popen('powershell.exe -Command "Get-Content .\Own.DAT | Set-Content -Encoding utf8 Own1.dat"')

filepath = __file__
filepath = filepath[:-7]
with open(filepath+"Own1.dat", "r") as f:

我可以确认文件路径+“ Own1.dat”正在获取正确的文件路径。但是无法弄清楚问题可能是什么。 编辑:有人要求确认,这是我收到的消息:

C:\Users\Debojit\MiniConda3\python.exe "E:/My Documents/Work/essbase/ownership/test.py"
Traceback (most recent call last):
  File "E:/My Documents/Work/essbase/ownership/test.py", line 18, in <module>
    with open(filepath+"Own1.dat", "r") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'E:/My Documents/Work/essbase/ownership/Own1.dat'

Process finished with exit code 1

注意:奇怪的是,如果我将powershell命令放入一个单独的批处理文件中,在python脚本中编写一个代码来运行它,则工作不会出现任何问题。这是我正在谈论的代码:

import os
import subprocess


from subprocess import Popen
p = Popen("conversion.bat", cwd=r"E:\My Documents\Work\essbase\ownership")
stdout, stderr = p.communicate()

filepath = __file__
filepath = filepath[:-7]
with open(filepath+"Own1.dat", "r") as f:

conversion.bat文件包含以下内容

powershell.exe -Command "Get-Content .\Own.DAT | Set-Content -Encoding utf8 Own1.DAT"

但是我不想包含一个单独的批处理文件和python脚本一起使用。

任何想法可能是导致问题的原因吗?

3 个答案:

答案 0 :(得分:1)

您使用的Popen()错误。

如果要运行命令并向其传递参数,则必须将它们作为列表传递,如下所示:

subprocess.Popen(['powershell.exe', '-Command', ...])

在您的代码中,popen尝试运行一个名为powershell.exe -Command "Get-Content ...的命令,该命令当然不存在。

要使用一个简单的示例,此代码将不起作用:

subprocess.Popen('ls -l')

因为它正在尝试运行一个字面名为ls -l的命令。

但这确实可行:

subprocess.Popen(['ls', '-l'])

答案 1 :(得分:1)

您的错误与无关。 Popen异步运行。在一个命令中,您正在使用busboy.on('file', (fieldname, file, filename, encoding, mimetype) => { console.log('ok', fieldname, file, filename, encoding, mimetype); if (mimetype !== 'image/jpeg' && mimetype !== 'image/png') { return res.status(400).json({ error: 'Wrong file type submitted' }); } // my.image.png => ['my', 'image', 'png'] const imageExtension = filename.split('.')[filename.split('.').length - 1]; // 32756238461724837.png imageFileName = `${Math.round( Math.random() * 1000000000000 ).toString()}.${imageExtension}`; const filepath = path.join(os.tmpdir(), imageFileName); imageToBeUploaded = { filepath, mimetype }; file.pipe(fs.createWriteStream(filepath)); }); ,而在另一命令中,您没有使用。

答案 2 :(得分:0)

我仍然不知道为什么会发生错误。但是我找到了解决方法

with open("conversion.bat","w") as f:
    f.writelines("powershell.exe -Command \"Get-Content '" +fileName+ "' | Set-Content -Encoding utf8 Own1.dat\"")


from subprocess import Popen
p = Popen("conversion.bat", cwd=os.path.dirname(os.path.realpath(__file__)))
stdout, stderr = p.communicate()

os.remove("conversion.bat") 

基本上,我将创建批处理文件,运行该文件,然后在创建该文件后将其删除。不用了,为什么我必须使用这条路线,但是行得通。