Как добавить модуль в мою PYTHONPATH? - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь загрузить код с github, который содержит библиотеку "ee" - Google Earth Engine. GitBash выдает мне ошибку:

ModuleNotFoundError: No module named 'fcntl'

fcntl - это модуль в библиотеке Google Earth Engine. У меня есть Windows, и, кажется, Linux требуется. Мне было приказано добавить модуль (fcntl) в PYTHONPATH. Любые другие предложения для этой ошибки также будут полезны! Код, который я собираюсь добавить в PYTHONPATH, приведен ниже.

def fcntl(fd, op, arg=0):    
    return 0

def ioctl(fd, op, arg=0, mutable_flag=True):   
    if mutable_flag:    
        return 0    
    else:    
        return ""    

def flock(fd, op):   
    return

def lockf(fd, operation, length=0, start=0, whence=0):    
    return

1 Ответ

0 голосов
/ 27 июня 2018

Во-первых, это, вероятно, не будет работать для вас.

Вы не можете включить Windows в Linux, просто добавив модули в свою библиотеку Python. Причина, по которой на вашем пути нет модуля fcntl, заключается в том, что fcntl не включен в Windows. И причина, по которой он не включен в Windows, заключается в том, что ОС Windows не поддерживает системные вызовы, которые обертывают модуль, или что-то достаточно близкое, чтобы разумно эмулировать эти системные вызовы.

Если у вас есть код, требующий fcntl, этот код не может быть запущен в Windows (если вы не проделали значительную работу по его переносу, чтобы не требовать fcntl в первую очередь).


Если у вас есть код, который не требует fcntl, но использует его в любом случае, или если вам просто нужно что-то для временных целей разработки, чтобы вы могли перехватывать и исправлять ошибки общего доступа к файлам при переносе кода на не требуется fcntl, тогда вы можете использовать фиктивный код msoliman, который я объясню, как это сделать ниже. Но вы, кажется, ожидаете, что это сделает магию, и это не сделает это.

Возможно, вы не уверены. Возможно, вы используете код, который использует другой код, который использует другой код, который использует fcntl в некоторых сценариях, но не в других, на самом деле может не потребоваться fcntl для выполнения каких-либо действий, которые вы на самом деле пытаетесь сделать с ним.

Если вы хотите проверить это, вы можете взять фиктивный код msoliman и изменить каждое тело функции на следующее:

raise RuntimeError('Oops, using fcntl!')

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


Если вашему коду действительно требуется fcntl, и вы не хотите / не можете портировать этот код на код Windows, который использует вызовы Win32 API (или кросс-платформенную библиотеку, такую ​​как portalocker), то что вы вероятно, нужно сделать, это установить Linux и запустить программу там.

Существует несколько способов запуска Linux поверх Windows, а не вместо Windows. Например, вы можете установить Docker для Windows , а затем создать контейнер для установки linux с приложением. Или вы можете использовать VMWare Player , чтобы, по сути, запустить образ Linux как приложение под Windows, а затем выполнить свою работу внутри этого образа. И так далее.


Наконец, msoliman "Поместите этот модуль в вашу PYTHONPATH" немного вводит в заблуждение.

Что вам действительно нужно сделать, так это вставить в ваш sys.path. PYTHONPATH - это всего лишь один из способов сделать это, и, вероятно, не тот, который вам нужен здесь.

Варианты:

  1. Просто поместите его в тот же каталог, что и ваш скрипт. Как сказано в документации: «Как инициализируется при запуске программы, первый элемент этого списка, path[0], является каталогом, содержащим скрипт, который использовался для вызова интерпретатора Python.»
  2. Поместите его в пакеты вашего пользовательского или системного сайта или в другой каталог, который уже используется по умолчанию sys.path. Вы можете import sys; print(sys.path) получить список этих каталогов. Если вы видите что-то в своем домашнем каталоге, это хорошее место для размещения; если нет, найдите что-нибудь с site-packages в названии.
  3. Поместите его в какой-нибудь другой каталог и задайте для переменной среды PYTHONPATH полный путь к каталогу. Вы можете установить переменную среды в командной строке Windows cmd, написав SET PYTHONPATH C:\Path\To\Directory. Это будет сохраняться только в течение текущего окна командной строки. Если вы хотите установить его постоянно, где-то на панели управления есть настройка (она меняется с каждой версией Windows; у суперпользователя должны быть хорошие актуальные ответы для каждой версии), где вы можете установить переменные среды System и User. Любая переменная среды пользователя вступает в силу в каждом новом окне командной строки, которое вы открываете с этого момента.
...