我正在尝试在一个foldersystem中找到几个带有os.walk()的'my_file.bat',如果文件名匹配,应该用subprocess.call()或.run()调用它。问题是os.path.abspath('my_file.bat')返回了一个联合'where\i\ran\the\script\from' + ˇmy_file.batˇ。
谁能告诉我为什么会发生这种情况,我怎样才能得到'my_file.bat'的位置?
import os
import subprocess
for root, dir, name in os.walk(r'C:\the\path\i\am\using\for\the\folder\system'):
for filename in name:
if filename == 'my_file.bat':
my_file_path = os.path.abspath('my_file.bat')
os.chdir(my_file_path)
subprocess.call('my_file.bat')发布于 2019-09-17 03:13:59
abspath不会帮你,因为它是从当前目录计算路径的。abspath如何知道walk正在做什么?
除了os.chdir(my_file_path)尝试使用文件作为参数来更改目录之外...好吧,最好永远不要在python脚本中使用chdir。
我怎么才能找到'my_file.bat‘的位置呢?
您不需要它(并且它不足以执行该文件)。您希望执行的是将当前目录设置为脚本所在目录的文件(使.bat文件更简单)
另一方面,root变量提供文件所在的目录。所以我会像这样重写你的代码:
for root, dir, name in os.walk(r'C:\the\path\i\am\using\for\the\folder\system'):
for filename in name:
if filename.lower() == 'my_file.bat':
subprocess.call('my_file.bat',shell=True,cwd=root)添加cwd=root允许call在执行之前(并且仅在调用中)将目录更改为脚本目录,而shell=True (您的下一个问题)确保您可以从subprocess.call调用脚本(而不是真正的可执行文件
如果文件名为MY_FILE.BAT,也要使用小写比较。对于所有这些怪癖,你必须喜欢窗户。
发布于 2019-09-17 03:21:01
最好使用pathlib,它使for循环变得更容易:
from pathlib import Path
import subprocess
root = Path(r'C:\the\path\i\am\using\for\the\folder\system')
for filename in root.rglob('my_file.bat')
subprocess.call(filename.name, cwd=filename.parent)发布于 2019-09-17 03:14:08
要获取通过os.walk获得的文件的路径,请使用os.path.join连接root和filename
my_file_path = os.path.join(root, 'my_file.bat')https://stackoverflow.com/questions/57963054
复制相似问题