运行一个 python 文件,该文件在批处理文件的文件名中使用 Unicode 字符

Run a python file which uses a Unicode character in the filename from a batch file

提问人:C. Nielsen 提问时间:10/7/2023 最后编辑:General GrievanceC. Nielsen 更新时间:10/10/2023 访问量:102

问:

我正在尝试运行的非常简单的 bat 文件,它本质上改变了目录/环境,然后使用 streamlit 运行程序,但我终生无法让它识别正在使用的 unicode 字符。这是 .bat 文件

@echo off
chcp 65001
call "C:\...\Miniconda3\Scripts\activate.bat"
call conda activate env
cd C:\...\Documents\GitHub\...
streamlit run 🌎_Project.py
pause

直到最近我才遇到问题,但无论我运行这个蝙蝠文件(或在 anaconda 提示符中逐行运行)时,我都会收到错误,其中 unicode 在 globe unicode 字符上读取不正确。

Error: Invalid value: File does not exist: ??_Project.py

我无法更改文件的名称,因为它位于更大的存储库中。我尝试以多种不同的格式保存蝙蝠文件(我认为UTF-8应该是正确的),并且我尝试调整字体以查看是否有奇怪的地方,但没有任何运气。除了手动重命名文件以及它出现在我本地的任何地方之外,还有什么解决方法吗?

python 批处理文件 utf-8 anaconda streamlit

评论

1赞 Mark Ransom 10/7/2023
看起来这里可能是问题,错误指示两个字符,而应该只有一个字符。streamlit
0赞 SomethingDark 10/7/2023
@MarkRansom - 这就是Unicode的工作方式。几乎所有字符都将是多个字节的组合。
3赞 SomethingDark 10/7/2023
但是,我同意,如果您已将脚本保存为 UTF-8 并且您有命令在其中,那么问题很可能出在 .您可以通过尝试运行 来确认这一点。如果批处理脚本有问题,您将收到错误,如果一切正常,您将看到 python 文件的文本。chcp 65001streamlittype 🌎_Project.pyThe system cannot find the file specified.
0赞 C. Nielsen 10/7/2023
如果我更新为键入 🌎 _Project.py 它将显示文件的内容,因此当通过命令窗口调用时,这可能是 streamlit 的问题(仅使用本地版本部署时程序运行良好,我遇到了问题)
0赞 Magoo 10/7/2023
FOR %%b IN ("🌎_Project.py") DO streamlit "%%b" …也许?或者,如果您的系统生成了短文件名,则可以使用短文件名(dir /x “🌎_Project.py”)

答:

-1赞 protoncracker 10/10/2023 #1

您面临的问题似乎与 CMD 对 Unicode 字符的有限支持有关。即使在更改用于启用 UTF-8 编码的代码页后,CMD 也可能不完全支持 Unicode 字符,例如文件名中的地球表情符号“🌎”。话虽如此,找到最佳解决方案确实取决于您的需求。chcp 65001

在我的情况下,该命令似乎按预期运行。这可能归因于我使用的是 Windows 10,这是一个更新的操作系统,尽管我不能肯定地说。有时,使用引号是必要的,但除此之外,它运行起来没有问题,这可能表明您正在使用不正确的原始编码保存文件。尽管如此,下面我提出了一些解决方案。

使用短文件名(8.3 文件名)

如果要将代码保持纯批处理状态,则此解决方案是最佳选择。

  1. 导航到 Python 脚本所在的目录 命令提示符。
  2. 运行以查看简短的 8.3 文件名和常规文件名 文件名。dir /x
  3. 标识 _Project.py 的🌎短文件名。
  4. 在 .bat 脚本中使用短文件名,而不是 🌎 _Project.py。

例如,如果短文件名是 GLOBE~1.PY,则像这样修改 .bat 脚本:


@echo off
chcp 65001
call "C:\...\Miniconda3\Scripts\activate.bat"
call conda activate env
cd C:\...\Documents\GitHub\...
streamlit run GLOBE~1.PY
pause

Windows 具有此功能,它对您的目的非常有用。

使用 PowerShell

可以将整个批处理文件替换为 PowerShell 脚本,该脚本对 Unicode 和其他功能的支持要好得多,你以后可能需要添加这些功能。

创建包含以下内容的文件:.ps1


$env:Path += ";C:\...\Miniconda3\Scripts\"
conda activate env
Set-Location "C:\...\Documents\GitHub\..."
streamlit run "🌎_Project.py"
pause

若要运行 PowerShell 脚本,请右键单击它,然后选择“使用 PowerShell 运行”。

这样,您可以拥有更灵活的环境并保证其正常工作。

手动重命名(如果没有其他选项)

如果上述解决方案不合适,并且无法更改原始文件名,则可以将文件复制到具有 ASCII 名称的临时文件,运行它,然后将其删除。这不是最优雅的解决方案,但会起作用,如果情况是你不能运行但可以访问它。


@echo off
chcp 65001
call "C:\...\Miniconda3\Scripts\activate.bat"
call conda activate env
cd C:\...\Documents\GitHub\...
copy "🌎_Project.py" "temp_Project.py"
streamlit run temp_Project.py
del "temp_Project.py"
pause

希望对你有所帮助。

评论

0赞 General Grievance 10/10/2023
当你说,“我使用的是 Windows 10,这是一个更新的操作系统”,你是什么意思?比什么更新?
0赞 protoncracker 10/13/2023
通过声明我使用的是 Windows 10,我旨在强调与旧版本(如 Windows 7 及以下版本)相比,它是一个更新的操作系统。我的意思是,这篇文章的作者可能在一个过时的平台上运行,其中某些功能(例如命令提示符中的 Unicode 支持)可能尚不可用,因为它在我的命令提示符下运行良好,即使我给出了适当的修复。@GeneralGrievance