因此,我编写了一段代码,该代码首先运行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脚本一起使用。
任何想法可能是导致问题的原因吗?
答案 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)
您的错误与powershell无关。 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")
基本上,我将创建批处理文件,运行该文件,然后在创建该文件后将其删除。不用了,为什么我必须使用这条路线,但是行得通。