Найти - Пользователи
Полная версия: os.getcwd() разные слеши в разных осях
Начало » Python для новичков » os.getcwd() разные слеши в разных осях
1
agryn
configfilename = 'config.ini'
cfgfile = open(os.getcwd() + '\\' + configfilename)
Нужно что б в разных осях конфигурационный файл открывался без заморочки с слешем
в принципе можно сначала установить платформу а потом добавить необходимый слеш, но есть ли возможность без заморочек.
Может есть другой способ открыть конфигурационный файл что лежит в каталоге со скриптом.
reclosedev
http://docs.python.org/library/os.path.html#os.path.join

А вообще, если файл лежит в каталоге со скриптом, и скрипт запускается из него, то
cfgfile = open(configfilename)
fata1ex
__file__
os.path.abspath

А вообще есть такая вещь как settings.py/config.py, всё делается просто импортом.
o7412369815963
Тут можно взять “правильный” слеш:
>>> import os
>>> os.sep
'/'
для linux

а вообще вроде под виндой питон нормально работает с “/” (как и в nix/mac), на py 2,6 проверял, но лучше юзать os.sep
PooH
configfilename = 'config.ini'
cfgfile = open(os.path.join(os.path.dirname(__file__), configfilename))
PooH
fata1ex
А вообще есть такая вещь как settings.py/config.py, всё делается просто импортом.
Сисадмины вас проклянут. Вот в большинстве php cms конфиги сделаны таким импортом, понадобилось утильку написать - данные из конфигов извлекать, так единственный выход был вызывать php из консоли, в нем исполнять скрипт, что импортирует конфиг и печатает в виде JSON на экран, потом вывод парсить, уууууу….
odnochlen
PooH
configfilename = 'config.ini' 
cfgfile = open(os.path.join(os.path.dirname(__file__), configfilename))

И ловим факап на двойке, если в пути есть символы, которых нет в текущей кодовой таблице, т.к. sys.argv в двойке - str (я юзал sys.argv, буду считать, что это одно и то же).

Я читал, что __file__ не везде работает. И что лучше - dirname или abspath? Какой самый корректный вариант открытия файлов в каталоге програмы?

o7412369815963
а вообще вроде под виндой питон нормально работает с “/” (как и в nix/mac), на py 2,6 проверял, но лучше юзать os.sep
Вопрос в догонку - а можно ли в конфигах сохранять пути с сепаратором, или надо мудрячить с os.path.join? А \ на линупсе будет работать?
reclosedev
odnochlen
Я читал, что __file__ не везде работает. И что лучше - dirname или abspath? Какой самый корректный вариант открытия файлов в каталоге програмы?
Не знаю самый ли корректный, но делаю так:
import os
import sys
 
def program_path():
    main_file = unicode(sys.argv[0], sys.getfilesystemencoding())
    return os.path.realpath(os.path.dirname(main_file))
На выходе Юникодовый путь до папки с программой, даже если это .exe сделанный cxFreeze и т.п.

odnochlen
Вопрос в догонку - а можно ли в конфигах сохранять пути с сепаратором, или надо мудрячить с os.path.join
Наверное, лучше сохранять с прямым слэшем, а потом на крайний случай использовать os.path.normpath(path)
os.path.normpath(path)
Normalize a pathname. This collapses redundant separators and up-level references so that A//B, A/B/, A/./B and A/foo/../B all become A/B.

It does not normalize the case (use normcase() for that). On Windows, it converts forward slashes to backward slashes. It should be understood that this may change the meaning of the path if it contains symbolic links!

Но Win нормально с ‘/’ работает.

odnochlen
А \ на линупсе будет работать?
нет
ubuntu@devbox:~$ python
Python 2.7.2+ (default, Oct 4 2011, 20:03:08)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open(r"tmp\test.txt")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'tmp\\test.txt'
>>> f = open(r"tmp/test.txt")
>>> f
<open file 'tmp/test.txt', mode 'r' at 0xb73dfe38>
EBFE
Еще DOS прекрасно работал с ‘/’.
Так же как и все соответсвующие WinAPI.
004011C8   . 68 00000080    PUSH 80000000                            ; |Access = GENERIC_READ
004011CD . 68 75384000 PUSH test.00403875 ; |FileName = "D:/temp/test/test.mpt"
004011D2 . E8 A7090000 CALL <JMP.&kernel32.CreateFileA> ; \CreateFileA
Другое дело, что вызов WinAPI возвращает пути с ‘\’. Ну и всякие приложения/утилиты могут заартачится, если шибко умный “проггер” встроил соответсвующию проверку


This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB