PyQT QFileDialog – получить полный каталог, включая IP-адрес диска

Я хотел бы получить полный путь к моему каталогу, например:

//192.168.1.23/D/test/test/aaaa/

or

//192.168.1.23/D:/test/test/aaaa/

Как я могу заставить QFileDialog предоставить мне IP-адрес выбранного мной жесткого диска?

В настоящее время используется

self.project= str(QtGui.QFileDialog.getExistingDirectory(self,  "Select Directory", lastDir))

пытался пройти через os.path.dirname(self.project), но это всегда сводится только к D:\

Спасибо!


person Dariusz    schedule 21.08.2016    source источник


Ответы (2)


То, что вы хотите сделать, невозможно в PyQt напрямую с помощью QFileDialog, вместо этого вы можете получить IP-адрес вашего компьютера другим методом, а затем объединить его с путем к файлу, что-то вроде этого. QFileDialog не поддерживает сеть

import socket
def get_ip_addr():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(("8.8.8.8", 80))
    return s.getsockname()[0]

ip = get_ip_addr()

path = self.project= str(QtGui.QFileDialog.getExistingDirectory(self,  "Select Directory", lastDir))

file_path = '//{}/{}'.format(ip, path) # or what ever formatting suits you

Вы также можете взглянуть на QNetworkInterface http://pyqt.sourceforge.net/Docs/PyQt4/qnetworkinterface.html#interfaceFromName, если вас интересуют другие адреса на вашем компьютере, но приведенный выше пример просто возвращает IP-адрес, который использовался для маршрутизации к 8.8.8.8

person danidee    schedule 21.08.2016
comment
Это правильная идея для решения, но вы можете получить ее без фактического подключения к какой-либо удаленной конечной точке. Вместо этого я бы использовал что-то вроде socket.gethostbyname(socket.gethostname()). - person bnaecker; 22.08.2016
comment
это может вернуть 127.0.0.1 на машине, для которой имя хоста установлено на 127.0.0.1 в /etc/hosts... Машины Linux, по-видимому, но, похоже, оператор использует окна, поэтому он может работать на окнах, но я не уверен - person danidee; 22.08.2016
comment
Эй, я думал об этом. Но если я попытаюсь перечислить сетевой диск, скажем, //192.168.1.50/E, и запущу параметр gethostname() или имя сокета, результатом будет //192.168.1.23/E..., направляющий меня в неправильное место? Мало того, что если у меня 2 сетевые карты. Я думаю, что мне может понадобиться 2 IP-адреса для данного драйвера. Честно говоря, я еще не проверял, но попробую, может быть, я ошибаюсь... Спасибо! - person Dariusz; 22.08.2016

Не уверен, где я его нашел, но вот вариант, которому я следовал в конце. Я позволяю пользователю решать, какое устройство использовать для определения местоположения

from netifaces import interfaces, ifaddresses, AF_INET
p =[]
for ifaceName in interfaces():
    addresses = [i['addr'] for i in ifaddresses(ifaceName).setdefault(AF_INET, [{'addr':'No IP addr'}] )]
    p.append(ifaceName.join(addresses))   

print p[0],p[1]
print p
person Dariusz    schedule 12.09.2016