Python FileNotFoundError: [Errno 2] несмотря на указание полного пути к файлу - PullRequest
0 голосов
/ 11 июля 2019

Итак, я написал фрагмент кода, который сначала запускает команду 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:

Я могу подтвердить, что filepath + "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:

Файл translation.bat содержит

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

Но я не хочу включать отдельный пакетный файл для сценария Python.

Есть идеи, что может быть причиной проблемы?

Ответы [ 3 ]

1 голос
/ 11 июля 2019

Ваша ошибка не связана с .Попен работает асинхронно.В одной команде вы используете communicate(), а в другой - нет.

1 голос
/ 11 июля 2019

Вы используете Popen() неправильно.

Если вы хотите выполнить команду и также передать ей аргументы, вы должны передать их в виде списка, например:

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

В вашем коде popen пытается запустить команду с буквальным названием powershell.exe -Command "Get-Content ..., которая, конечно, не существует.

Чтобы использовать более простой пример, этот код не будет работать:

subprocess.Popen('ls -l')

потому что он пытается запустить команду с буквальным названием ls -l.

Но это работает:

subprocess.Popen(['ls', '-l'])
0 голосов
/ 12 июля 2019

Я все еще не мог понять, почему произошла ошибка.Но я нашел обходной путь

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") 

По сути, я бы создал командный файл, запустил его и затем удалил, как только файл был создан.Не зачем мне этот маршрут использовать, но он работает.

...