Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 子进程间歇返回空_Python_Macos_Subprocess_Stdout - Fatal编程技术网

Python 子进程间歇返回空

Python 子进程间歇返回空,python,macos,subprocess,stdout,Python,Macos,Subprocess,Stdout,我正在Mac OS上运行python3中的一个子进程,从本地目录中保存的大量图像中检索EXIF图像数据 代码间歇性地工作。Ruffly每隔3次调用,子流程将返回byte对象(如预期的那样),但它是空的b“” 故障并非特定于任何特定图像文件(更改) 我尝试了两个版本的代码,一个是调用Popen.wait(..)(示例查找下面的纬度),另一个是立即调用.communicate()(示例查找下面的经度) 尝试1结果: …======。。。。。。。 IMG_0149.JPG已经成功了 .......==

我正在Mac OS上运行python3中的一个子进程,从本地目录中保存的大量图像中检索EXIF图像数据

代码间歇性地工作。Ruffly每隔3次调用,子流程将返回byte对象(如预期的那样),但它是空的b“”

故障并非特定于任何特定图像文件(更改)

我尝试了两个版本的代码,一个是调用Popen.wait(..)(示例查找下面的纬度),另一个是立即调用.communicate()(示例查找下面的经度)

尝试1结果:

…======。。。。。。。
IMG_0149.JPG已经成功了
.......========.......
IMG_0161.JPG已经成功
.......========.......
IMG_0377.JPG已经成功了
.......========.......
查找纬度失败,异常:无法将字符串转换为浮点:
lat值:b''
查找经度失败,异常:无法将字符串转换为浮点:
lon值:b''
尝试2结果:

…======。。。。。。。
IMG_0149.JPG已经成功了
.......========.......
IMG_0161.JPG已经成功
.......========.......
IMG_0377.JPG已经成功了
.......========.......
IMG_0007.JPG已经成功了
.......========.......
查找lattitude失败,异常:无法将字符串转换为浮点:
lat值:b''
查找经度失败,异常:无法将字符串转换为浮点:
lon值:b''

可能是您引用文件名的方式导致了问题,也可能是Michael Butscher建议的时间。我试着自己写一个解决方案,发现我的大多数图片都没有坐标

这是我的解决方案,请让我知道它是否适合你。请注意,对于那些没有坐标的图片,
lat==“(空)”
lon=“(空)”
。对于具有坐标的对象,
lat
lon
将是浮点

#!/usr/bin/env python3
import pathlib
import subprocess

def main():
    """ Entry """
    for pic_file in pathlib.Path('.').glob('*.jpg'):
        print('-' * 72)
        print(pic_file)
        command = ['mdls',
                   '-name', 'kMDItemLatitude',
                   '-name', 'kMDItemLongitude',
                   str(pic_file)]
        output = subprocess.check_output(command, encoding='utf-8')
        # Sample output
        #    kMDItemLatitude  = (null)
        #    kMDItemLongitude = (null)
        # or
        #    kMDItemLatitude  = 46.75725833333333
        #    kMDItemLongitude = -71.28605666666667        
        print(output)

        # Parse the output
        lines = output.splitlines()
        values = [line.split()[-1] for line in lines]
        print(values)

        # Convert to float
        try:
            lat, lon = [float(value) for value in values]
        except ValueError:
            lat, lon = values

        print('Latitude =', lat)
        print('Logitude =', lon)


if __name__ == '__main__':
    main()
笔记
  • 我不使用
    grep
    awk
    命令,因为我想自己解析这些值
  • 通常,
    子流程
    函数的输出将返回原始字节数组,我使用
    encoding='utf-8'
    将其转换为Python 3字符串

胡乱猜测:由管道连接的命令并行运行,当mdls终止而不等待其余命令时,shell调用可能结束。为什么在第一行后缩进?您是否尝试在失败的文件上手动运行命令
mdls
?这可能是因为它们不包含任何EXIF信息。first post-很抱歉设置了格式。是的,我尝试过独立运行任何失败的文件名,它们工作正常。通常,同一个文件在两次不同的运行尝试中都能第二次运行-这绝对不是conclusionWorks中的文件的问题,谢谢!我假设最初的问题可能存在于对grep和awk的子流程调用中,因为.subprocess.check_输出更改也不是孤立地工作的。在进一步测试时,问题仍然存在——尽管发生的频率要低得多(每50个条目一次,而不是每3个条目一次)。具体地说,当值存在时,子流程将在mdls查询中间歇性地返回null。同样,同一个文件在另一个场合也可以使用。就我的目的而言,这个解决方案已经足够了(我可以检查故障并重新运行,直到它工作为止)-我应该将它作为标记的解决方案吗?这是一个奇怪的问题,我不知道它是否与时间有关。尝试在两个文件之间进行第二次睡眠,看看是否有帮助。
#!/usr/bin/env python3
import pathlib
import subprocess

def main():
    """ Entry """
    for pic_file in pathlib.Path('.').glob('*.jpg'):
        print('-' * 72)
        print(pic_file)
        command = ['mdls',
                   '-name', 'kMDItemLatitude',
                   '-name', 'kMDItemLongitude',
                   str(pic_file)]
        output = subprocess.check_output(command, encoding='utf-8')
        # Sample output
        #    kMDItemLatitude  = (null)
        #    kMDItemLongitude = (null)
        # or
        #    kMDItemLatitude  = 46.75725833333333
        #    kMDItemLongitude = -71.28605666666667        
        print(output)

        # Parse the output
        lines = output.splitlines()
        values = [line.split()[-1] for line in lines]
        print(values)

        # Convert to float
        try:
            lat, lon = [float(value) for value in values]
        except ValueError:
            lat, lon = values

        print('Latitude =', lat)
        print('Logitude =', lon)


if __name__ == '__main__':
    main()