subprocess.popen и subprocess.run при вызове другого file.py выдает ошибку импорта в linux.Python 3.6.4 - PullRequest
0 голосов
/ 25 мая 2018

subprocess.popen и subprocess.run, при вызове file.py, оба выдают ошибку импорта в Linux.Python 3.6.4 в Linux.Python 3.6.5 для Windows.Windows работает без проблем.Linux выдает ошибку.Вызовы должны быть независимыми и невидимыми для исходного процесса / сценария.

Для Linux (любая из следующих строк):

  proc = subprocess.run("python3 foo.py", shell=True, stdin=None, stdout=None, stderr=None, close_fds=True)
  proc = subprocess.Popen("python3 foo.py", shell=True, stdin=None, stdout=None, stderr=None, close_fds=True)

Для Windows (любая из следующих строк):

  proc = subprocess.run("python bar.py", shell=True, stdin=None, stdout=None, stderr=None, close_fds=True)
  proc = subprocess.Popen("python bar.py", shell=True, stdin=None, stdout=None, stderr=None, close_fds=True)

Также обратите внимание, что при запускеотдельные сценарии работают без инцидентов;только когда вы вызываете его из другого скрипта, он выдает ошибки.Любые идеи?

РЕДАКТИРОВАТЬ: Например, предположим, что это foo.py:

  import requests, urllib.request as urllib2, wget, ftplib, sys, tkinter as tk, tkinter.ttk as ttk, serial, threading, platform, time, socket, os, json, struct, logging, pickle, re, queue, subprocess, uuid, netifaces as nif, zipfile, ctypes
  from platform import system as OS_VER
  from PIL import Image, ImageTk


  LibList = [requests, urllib2, wget, ftplib, sys, tk, ttk, serial, threading, platform, time, socket, os, json, struct, logging, pickle, re, queue, subprocess, uuid, nif, zipfile, ctypes, Image, ImageTk, platform]

  for x in range(len(LibList)):
     try: print(LibList[x].__file__)
     except: print(LibList[x])

И это bar.py

  proc = subprocess.Popen("python3 foo.py", shell=True, stdin=None, stdout=None, stderr=None, close_fds=True)

Run bar.py и foo.py получают ошибку в Linux, но не в Windows.Пропустите bar.py и запустите foo.py, но он отлично работает в Linux.

1 Ответ

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

Единственное решение, которое я нашел, было создать сценарий оболочки и вызвать его с помощью subprocess.Popen или subprocess.run.

пример: subprocess.Popen('Foo.sh')

и файл Foo.sh:

#!/usr/bin/env bash

python3 Foo.py > log.log &

Символ & необходим для разветвления процесса в Linux.В противном случае он блокируется и не будет работать до тех пор, пока не будет закрыт.

...