Python os.listdir() ведет себя странно, требуется некоторое объяснение

#python #pycharm #virtualenv

#python #pycharm #virtualenv

Вопрос:

Я использую python с Anaconda в PyCharm IDE (Windows 10) и использую виртуальную среду. Это мой код, о котором идет речь,

 print('# File...')
print(os.listdir("../MyData/Data/"))
  

Когда я запускаю код в консоли (щелкните правой кнопкой мыши, а затем «Выполнить раздел в консоли»), он работает отлично. Однако, когда я запускаю весь код (с помощью зеленой кнопки), он выдает ошибку FileNotFoundError: [WinError 3] Система не может найти указанный путь: ‘../MyData/Данные /’

Может кто-нибудь, пожалуйста, объяснить, почему это происходит, и возможное направление? Спасибо.

Комментарии:

1. Звучит так, ../MyData/Data как будто его не существует. Убедитесь, что вы находитесь в папке, в которой, по вашему мнению, находитесь os.getcwd() .

2. используйте полный путь вместо up . full/path/here вместо ../partial/path .

3. Возможно, было бы проще указать местоположение данных относительно скрипта … os.listdir(os.path.join(os.path.basename(__file__), os.pardir, 'MyData', 'Data'))

4. Разница в вашем «текущем рабочем каталоге». При запуске с консоли это каталог, в котором вы находились при запуске программы. Когда вы находитесь в IDE, это, вероятно, каталог, в котором установлена IDE.

5. Это относительный путь. Вопрос в том, относительно чего. Это относительно текущего рабочего каталога . Что это? print(os.getcwd())

Ответ №1:

Будьте осторожны, Windows обычно имеет "" в адресе. Это очень просто, но может стать большой проблемой. Поскольку "" используется как escape, вам придется использовать "\" . Попробуйте этот тест и убедитесь, что адрес правильный:

 import os
print(os.getcwd())
  

Он напечатает ваш текущий рабочий каталог

Комментарии:

1. Windows API с незапамятных времен мог использовать / и ` в именах путей взаимозаменяемо.

2. Спасибо. Как я упоминал выше, это помогло мне сузить область рассмотрения.

Ответ №2:

У всех программ есть рабочий каталог, определяемый тем кодом, который их запустил. Когда вы щелкаете правой кнопкой мыши и запускаете в консоли, консоль, как часть процесса инициализации, специально устанавливает текущий рабочий каталог в ваш домашний каталог. То, что происходит при запуске в графическом интерфейсе, зависит от оконного менеджера, который запускает программу. Я думаю, Microsoft Windows любит устанавливать CWD в каталог исполняемого файла, но я не уверен.

Способ исправить это — вручную установить текущий каталог при запуске вашей программы.

 import os
os.chdir(os.path.expanduser('~'))
  

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

Комментарии:

1. Что, если я хочу, чтобы все было наоборот? Я не хочу, чтобы программа запускалась в моем домашнем каталоге / $HOME / ~ . Я хочу, чтобы он запускался там, где он есть, в каталоге, в котором он находится. Даже когда я запускаю его из Windows start (через поиск или что-то еще). Удаление необходимого шага открытия пути к файлу и запуск его из проводника. <— в Windows 10

2. @Brambor Выполняемый скрипт находится в, sys.argv[0] поэтому os.path.dirname(sys.argv[0]) получает его каталог. Вы также можете использовать __file__ атрибут модуля, который сообщает вам, откуда этот импортированный модуль.

3. О, да, я решил это некоторое время назад. Я использовал path_to_DnD = sys.path[0] который указывает на то, где находится мой файл DnD.py . Затем я форматирую все пути как абсолютные: Я использую "%s/tests" % path_to_DnD вместо "tests" для указания на файлы. DnD.py Файл — это тот, который я запускаю при запуске Windows.

Ответ №3:

Вы должны использовать полный путь, как показано ниже:

 os.listdir ("C:UsersYourUsernameFullPath")
  

Комментарии:

1. «Tom» не сработал бы, разве это не очевидно? 🙂 Однако опция полного пути сработала. Но, мой запрос был, почему это не работает, и что конкретно я (кто угодно) должен знать, чтобы это исправить.