#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 102. @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» не сработал бы, разве это не очевидно? 🙂 Однако опция полного пути сработала. Но, мой запрос был, почему это не работает, и что конкретно я (кто угодно) должен знать, чтобы это исправить.