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