python - 使用 pyinstaller 在 EXE 中找不到“os.path.isdir”
问题描述
我尝试访问 ECM Drive 路径。并且我能够访问 pycharm 编译系统中的 ECM Drive 路径。但我无法使用 pyinstaller 在 EXE 文件中访问它。
我测试了一些东西,但我无法使用 EXE 访问 ECM 系统。
有什么区别?如何使用 EXE 文件访问 ECM Drive。
添加内容
在pycharm中编译时可以找到路径。 在此处输入图像描述
但我在EXE中找不到路径。 在此处输入图像描述
我以管理员身份测试运行编译的 EXE。但结果是一样的。 在此处输入图像描述
代码
import sys, os, shutil
from PySide6.QtWidgets import *
from multiprocessing import Process
import clipboard
import time
folder_path = [["U:/전사 폴더/NAS2/Control 3/01.기종별프로그램/2. 보유 프로그램/2. AET (승강기식)",
"U:/전사 폴더/NAS2/Control 3/01.기종별프로그램/2. 보유 프로그램/1. AMT (다층순환식)",
"U:/전사 폴더/NAS2/Control 3/01.기종별프로그램/2. 보유 프로그램/3. ACT (평면왕복식)"],
["U:/전사 폴더/NAS1/Public/[000 주차현장설계도면]/[DET] 승강기식/[DET_2015이후]",
"U:/전사 폴더/NAS1/Public/[000 주차현장설계도면]/[DMC] 다층순환식/[DMC_2015이후]",
"U:/전사 폴더/NAS1/Public/[000 주차현장설계도면]/[DMF] 평면왕복식/[2015이후]"],
["U:/전사 폴더/NAS2/Control 3/01.기종별프로그램/- 표준 프로그램/승강기식",
"U:/전사 폴더/NAS2/Control 3/01.기종별프로그램/- 표준 프로그램/다층순환식",
"U:/전사 폴더/NAS2/Control 3/01.기종별프로그램/- 표준 프로그램/평면왕복식"],
["U:/전사 폴더/NAS2/Control 3/02.기종별 표준 전기도면/2.승강기식(AET)/국내/표준",
"U:/전사 폴더/NAS2/Control 3/02.기종별 표준 전기도면/1.다층순환식(AMT)",
"U:/전사 폴더/NAS2/Control 3/02.기종별 표준 전기도면/3.평면왕복식(ACT)/DMF 전기도면(표준 BOM 전기도면)/평면왕복식 표준전기도면"]]
def copyFolder(path, file_path, fname):
shutil.copytree(os.path.join(path, file_path), os.path.join(fname, file_path))
print("복사 완료")
def copyFile(src, fname, dst):
shutil.copyfile(src, os.path.join(dst, fname))
print("복사 완료")
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.setupUI()
self.desktop_path = os.path.join(os.environ["HOMEPATH"], "Desktop")
os.chdir(self.desktop_path)
def setupUI(self):
self.setGeometry(800, 200, 300, 300)
self.setWindowTitle("PyStock v0.1")
self.lineEdit = QLineEdit(self)
self.combobox = QComboBox(self)
self.combobox.addItem("승강기식")
self.combobox.addItem("다층순환식")
self.combobox.addItem("평면왕복식")
self.folderCombobox = QComboBox(self)
self.folderCombobox.addItem("보유 프로그램")
self.folderCombobox.addItem("주차현장설계도면")
self.folderCombobox.addItem("표준 프로그램")
self.folderCombobox.addItem("표준 전기도면")
self.pb1 = QPushButton("폴더 다운로드")
self.pb2 = QPushButton("파일 다운로드")
self.pb3 = QPushButton("폴더 업로드")
self.pb4 = QPushButton("파일 업로드")
self.pb5 = QPushButton("경로 클립보드에 복사")
self.pb_test = QPushButton("TEST")
self.pb1.clicked.connect(self.folderDownloadButton)
self.pb2.clicked.connect(self.fileDownloadButton)
self.pb5.clicked.connect(self.copyClipboard)
self.pb_test.clicked.connect(self.test)
self.label = QLabel()
layout = QVBoxLayout()
saveLayout = QGroupBox("정보")
gridLayout = QGridLayout()
gridLayout.addWidget(self.lineEdit)
gridLayout.addWidget(self.combobox)
gridLayout.addWidget(self.folderCombobox)
gridLayout.addWidget(self.pb1)
gridLayout.addWidget(self.pb2)
gridLayout.addWidget(self.pb5)
gridLayout.addWidget(self.pb_test)
gridLayout.addWidget(self.label)
saveLayout.setLayout(gridLayout)
layout.addWidget(saveLayout)
self.setLayout(layout)
def test(self):
path = folder_path[self.folderCombobox.currentIndex()][self.combobox.currentIndex()]
print("path: ", path)
print("path Test: ", os.path.isdir(path))
# cnt = 0
# if (os.path.isdir(path)):
# filenames = os.listdir(path)
# for filename in filenames:
# if (self.lineEdit.text() in filename):
# file_path = filename
# cnt = cnt + 1
QFileDialog.getOpenFileNames(self, dir=path)
# if (os.path.isdir(path)):
# # 다운로드할 파일 위치 열기
# if cnt == 1:
# fnames, ftype = QFileDialog.getOpenFileNames(self, dir=os.path.join(path, file_path))
# else:
# fnames, ftype = QFileDialog.getOpenFileNames(self, dir=path)
def copyClipboard(self):
cnt = 0
# 기본 파일 경로 확인
path = folder_path[self.folderCombobox.currentIndex()][self.combobox.currentIndex()]
# 해당 경로에서 lineEdit에 기록된 프로젝트 번호를 포함하는 폴더명이 있는지 체크
if (os.path.isdir(path)):
filenames = os.listdir(path)
for filename in filenames:
if (self.lineEdit.text() in filename):
file_path = filename
cnt = cnt + 1
if (os.path.isdir(path)):
# 경로를 클립보드에 복사
if cnt == 1:
path = os.path.join(path, file_path)
clipboard.copy("내 PC/ECM Drive (U:)" + path[2:])
else:
clipboard.copy("내 PC/ECM Drive (U:)" + path[2:])
print(path[2:] + "가 클립보드에 복사되었습니다.")
def fileDownloadButton(self):
path = None
cnt = 0
file_path = None
# 기본 파일 경로 확인
path = folder_path[self.folderCombobox.currentIndex()][self.combobox.currentIndex()]
# try:
# print("(EXE)확인 결과: ", os.path.isdir(self.lineEdit.text()))
# os.chdir(sys._MEIPASS)
# print(sys._MEIPASS)
# except:
# print("(PYTHON)확인 결과: ", os.path.isdir(path))
# os.chdir(os.getcwd())
# print("찾을 위치: ", path)
# 해당 경로에서 lineEdit에 기록된 프로젝트 번호를 포함하는 폴더명이 있는지 체크
if (os.path.isdir(path)):
filenames = os.listdir(path)
for filename in filenames:
if (self.lineEdit.text() in filename):
file_path = filename
cnt = cnt + 1
if (os.path.isdir(path)):
# 다운로드할 파일 위치 열기
if cnt == 1:
fnames, ftype = QFileDialog.getOpenFileNames(self, dir=os.path.join(path, file_path))
else:
fnames, ftype = QFileDialog.getOpenFileNames(self, dir=path)
if fnames:
desktop_list = os.listdir(self.desktop_path)
cnt = 0
for desktop in desktop_list:
if (self.lineEdit.text() in desktop):
file_path = desktop
cnt = cnt + 1
if cnt == 1: # 파일 저장위치 결정
dst = QFileDialog.getExistingDirectory(self, dir=os.path.join(self.desktop_path, file_path))
else:
dst = QFileDialog.getExistingDirectory(self, dir=os.getcwd())
if dst:
print("파일 다운로드 시작")
os.chdir(dst)
for fname in fnames:
copyFile(fname, os.path.basename(fname), dst)
def folderDownloadButton(self):
path = None
cnt = 0
file_path = None
path = folder_path[self.folderCombobox.currentIndex()][self.combobox.currentIndex()]
if (os.path.isdir(path)):
filenames = os.listdir(path)
for filename in filenames:
if (self.lineEdit.text() in filename):
file_path = filename
cnt = cnt + 1
if (cnt == 1):
fname = QFileDialog.getExistingDirectory(self, dir=os.getcwd())
os.chdir(fname)
if not fname:
print("Cancel")
elif os.path.isdir(os.path.join(fname, file_path)):
print("동일한 이름의 폴더가 있습니다.")
self.label.setText("동일한 이름의 폴더가 있습니다.")
else:
print(file_path + "을(를) " + fname + " 로 복사합니다.")
self.label.setText(file_path + "을(를) " + fname + " 로 복사합니다.")
p = Process(target=copyFolder, args=(path, file_path, fname,))
p.start()
elif (cnt >= 2):
print("중복입니다.")
self.label.setText("중복입니다.")
else:
print("폴더를 찾을 수 없습니다.")
self.label.setText("폴더를 찾을 수 없습니다.")
if __name__ == "__main__":
#
# try:
# os.chdir(sys._MEIPASS)
# print(sys._MEIPASS)
# except:
# os.chdir(os.getcwd())
app = QApplication(sys.argv)
window = MyWindow()
window.show()
app.exec_()
添加
我尝试在 python 3.8 中运行。结果与EXE文件相同。我认为pycharm项目和python 3.8是有区别的。
添加
我确认在anaconda虚拟环境中编译时,os.path.isdir("path")返回True,但是当我在python虚拟环境或EXE文件中编译时,os.path.isdir("path")返回False。
解决方案
您需要在模块部分执行的第一步:
import os
提供此代码以访问 os 模块
然后在代码部分:
例如您要访问 java 软件:
java = c://(#here type your software location path)
os.path.isdir(java)
就这样。问题已解决。享受编程
推荐阅读
- string - RASA:如果示例包含数字作为数字序列,则检测到错误的意图和实体
- javascript - Discord.js V13:如何编辑交互的消息对象?
- python - 检测 Win 时出现问题(python 井字游戏)
- powershell - Powershell:方框中的问号是什么?
- c# - 如何将按钮添加到 WPF GridView
- ruby-on-rails - Rails API 应用程序的 CSRF 令牌
- laravel - 如何像点击预览一样显示 Laravel\Nova\Fields\Text 字段的内容
- swift - 无法转换结果
到预期的条件类型“布尔”。迅速 - json - 这个用于 Visual Studio 代码突出显示的代码有什么问题?
- dataframe - 如何从结构实例创建数据框?